Promise & async/await
13304 ワード
非同期操作を制御するために,コールバック関数を重ねるとコールバック地獄に陥る可能性がある.
コールバック地獄に陥り,コードのインデントレベルが深すぎると可読性が低下し,後でコードの修正も困難になる.
このcallback地獄を阻止するために利用できる方法は以下の通りである. Promise Generator async/await
その中でテクスチャが似ていると思われる
簡単に言えば、
同期表示非同期タスク
待機(保留):未履行または拒否の初期状態. 完了:演算が正常に完了しました. 却下(却下):演算に失敗しました. 待機状態から脱し、履行または拒否状態に入ると、解決したと言います.
すなわち、演算が完了するまで、
したがって、非同期動作は、 MDNからのコード例
この場合は
コードを直接見て理解しましょう.
このようにして、
たとえば、foo関数がある場合は1を返します.
戻り値にPromiseを入れなくても自動的にPromiseで包みます.
Promiseが処理されている場合は、停止した部分から実行します.
expression
Promiseまたは待機値(通常はPromiseを使用)
rv
Promiseは満足のいく値を返します
Promiseでない場合は、値自体を返します.
返される値が重要でない場合は、
実際に書いたコードを省いて持ってきました.
コードでは、
一目でわかるように、
あとでPromiseを使うときも
コールバック地獄に陥り,コードのインデントレベルが深すぎると可読性が低下し,後でコードの修正も困難になる.
このcallback地獄を阻止するために利用できる方法は以下の通りである.
Promise
とGenerator
はES 6に導入され、async/await
はES 2017に導入された.その中でテクスチャが似ていると思われる
Promise
とasync/await
が整理されている.簡単に言えば、
Generator
は、yield
キーワードおよびnext
メソッドによって関数内部コードを制御する順序で実行される.同期表示非同期タスク
Promise
Promise
オブジェクトは、非同期動作の結果を表す.Promise
には、次のいずれかの状態があります.待機
Promise
が待機状態で演算を実行し、実行または拒否になった場合(Promiseが処理された場合)、then
またはcatch
メソッドに追加されたタスクが実行される.すなわち、演算が完了するまで、
Promise
に接続された他の動作には移行しない.したがって、非同期動作は、
Promise
によって同期的に表すことができる.let myFirstPromise = new Promise((resolve, reject) => {
// 우리가 수행한 비동기 작업이 성공한 경우 resolve(...)를 호출하고, 실패한 경우 reject(...)를 호출합니다.
// 이 예제에서는 setTimeout()을 사용해 비동기 코드를 흉내냅니다.
// 실제로는 여기서 XHR이나 HTML5 API를 사용할 것입니다.
setTimeout( function() {
resolve("성공!") // 와! 문제 없음!
}, 250)
})
myFirstPromise.then((successMessage) => {
// successMessage는 위에서 resolve(...) 호출에 제공한 값입니다.
// 문자열이어야 하는 법은 없지만, 위에서 문자열을 줬으니 아마 문자열일 것입니다.
console.log("와! " + successMessage)
});
MDNには様々な方法が見られる.async/await
Promise
を使用すると、then
のような方法がいくつかくっついて毒性が悪くなります.この場合は
async/await
を使用し、毒性がより良く、使用がより便利である.async/await
においてもPromise
が暗黙的に使用されているため、Promise
の代わりにasync/await
が使用されるわけではない.Promise
大臣よりPromise
を挙げるthen
の方が適切です.どのように使いますか。
async
は非同期関数の前に付けられたキーワードであり、await
はPromiseまたは待機している値の前に付けられたキーワードである.await
は、async
関数でのみ使用できます.コードを直接見て理解しましょう.
function resolveAfter2Seconds() {
return new Promise(resolve => {
setTimeout(() => {
resolve('resolved');
}, 2000);
});
}
async function asyncCall() {
console.log('calling');
const result = await resolveAfter2Seconds();
console.log(result);
// expected output: "resolved"
}
asyncCall();
async function
からawait
のキーワードを持つ関数(Promise)に実行されるまで、await
の後のコードには移動しません.このようにして、
await
は、Promise
のthen
のように非同期ジョブごとに貼り付けることができる.async/await
の目的は、GeneratorとPromiseを結合するように、複数のPromiseを同時に使用する動作である.async
async
関数は常にPromiseを返します.async
関数の戻り値が明示的なPromiseでない場合、デフォルトはPromiseです.たとえば、foo関数がある場合は1を返します.
async function foo() {
return 1
}
上のfoo関数は下のコードと同じであると考えられる.戻り値にPromiseを入れなくても自動的にPromiseで包みます.
function foo() {
return Promise.resolve(1)
}
await
await
の後、Promiseが処理されるまで、Promiseを使用してasync
関数を停止することができる.Promiseが処理されている場合は、停止した部分から実行します.
[rv] = await expression;
expression
Promiseまたは待機値(通常はPromiseを使用)
rv
Promiseは満足のいく値を返します
Promiseでない場合は、値自体を返します.
await expression;
、例えば[rv] =
を省略して使用することができる.async
関数の戻り値がPromiseでない場合、await
以降の式がPromiseではないなどの解析Promiseに変換されます.async/await簡略化コードの使用
実際に書いたコードを省いて持ってきました.
コードでは、
channelManager()
はPromiseを返す関数です.channelManager.create()
.then((category) => {
channelManager.create(category.id)
.then((channel) => {
channel.send(channelText);
});
channelManager.create(category.id)
.then((channel) => {
channel.send(channelText);
});
});
上記のコードにasync/await
を適用してみます.const category = channelManager.create();
const channel1 = await channelManager.create(category.id);
await channel1.send(channelText);
const channel2 = await channelManager.create(category.id);
await channel2.send(channelText);
上のコードと下のコードの動作は全く同じではありませんが、修正はそれほど悪くありません.一目でわかるように、
async/await
を使うともっと簡潔です.あとでPromiseを使うときも
async/await
文法を使います.Reference
この問題について(Promise & async/await), 我々は、より多くの情報をここで見つけました https://velog.io/@heony/Promise-async-awaitテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol