ホームページ >ウェブフロントエンド >jsチュートリアル >非同期 JavaScript 関数がプリミティブ値を返す場合でも常に Promise を返すのはなぜですか?
Promise を返す非同期関数: 詳細な説明
JavaScript では、非同期関数と Promise の間の相互作用を理解することが重要です。 JavaScript ES2017 で導入された非同期関数を使用すると、コールバックを必要とせずに非同期操作が可能になります。これらは、非同期操作の最終的な結果を表す 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 が別の非同期関数で使用されていない場合、混乱が発生します。そして、非同期コンテキストの外側の変数に割り当てられます:
const time = latestTime(); // Promise { <pending> }
その結果、時間変数は保留状態になります。 async 関数によって返されるプリミティブ値の代わりに、promise を使用します。これは、非同期関数がその本体内でプリミティブ値を返す場合でも、常に Promise を返すために発生します。
この状況を適切に処理するには、2 つのオプションがあります:
1。 Promise を直接使用する:
イベント ハンドラーやモジュールのトップレベルなどの非同期コンテキストでは、Promise を直接処理する必要があります。 then() メソッドを使用できます:
latestTime() .then(time => { console.log(time); }) .catch(error => { // Handle/report error });
2.モジュール内のトップレベルの待機:
最新の JavaScript 環境はモジュール内のトップレベルの待機をサポートしており、次のように記述できます:
const time = await latestTime();
内部:
JavaScript エンジンが非同期関数をどのように処理するかを理解するには、その書き換えを明示的な約束として考慮してくださいcallback:
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 サイトの他の関連記事を参照してください。