非同期関数と Promise の関係を理解する
JavaScript では、非同期関数を使用すると、同期しているように見えるコードを作成できるため、非同期プログラミングが簡素化されます。非同期で実行されます。ただし、非同期関数が Promise とどのように相互作用するかを理解することは非常に重要です。
問題
次の非同期関数について考えてみましょう。
async function latestTime() { const bl = await web3.eth.getBlock('latest'); console.log(bl.timestamp); // Returns a primitive console.log(typeof bl.timestamp.then == 'function'); // Returns false - not a promise return bl.timestamp; }
latestTime() を呼び出すと、web3.eth.getBlock からタイムスタンプのプリミティブ値を受け取ることが期待されるかもしれません。ただし、代わりに、次のように保留中の Promise が返されます。
const time = latestTime(); // Promise { <pending> }
Promise が返される理由
非同期関数は常に Promise を返します。この Promise は、関数が非同期操作を完了して最終値を提供するか、エラーで拒否されたときに解決されます。 latestTime() の場合、Promise はタイムスタンプ プリミティブで解決されます。
Promise の処理方法
別の非同期関数の外側で、解決された値にアクセスするか、任意の値を処理する約束の then メソッドエラー:
latestTime() .then(time => { console.log(time); }) .catch(error => { // Handle/report error });
トップレベルの await
最新の環境ではモジュールでトップレベルの await がサポートされており、次のようなコードを記述できます:
const time = await latestTime();
この構文により、モジュール レベルでの Promise の操作が簡素化されます。ただし、モジュール内で未処理の Promise 拒否が発生すると、モジュールのロードに失敗する可能性があることに注意してください。
Promises を使用した非同期関数について理解する
非同期関数がどのように連携して動作するかをよりよく理解するにはPromise を使用する場合、JavaScript エンジンが非同期関数を Promise Executor にコンパイルする方法を検討すると役立ちます。 function:
function latestTime() { return new Promise((resolve, reject) => { web3.eth.getBlock('latest') .then(bl => { console.log(bl.timestamp); console.log(typeof bl.timestamp.then == 'function'); resolve(bl.timestamp); }) .catch(reject); }); }
この表現:
結果として、非同期関数は呼び出し側コードに事実上 Promise を返します。
以上がJavaScript の非同期関数はどのようにして常に Promise を返すのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。