ホームページ >ウェブフロントエンド >jsチュートリアル >JavaScript の非同期関数はどのようにして常に Promise を返すのでしょうか?

JavaScript の非同期関数はどのようにして常に Promise を返すのでしょうか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-20 11:50:09379ブラウズ

How Do Async Functions in JavaScript Always Return a Promise?

非同期関数と 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 に渡される Promise Executor 関数として表されます。
  • 非同期操作は次のときに開始されます。 web3.eth.getBlock は同期的に呼び出されます。
  • Promiseコールバックは、Promise を解決または拒否するために使用されます。

結果として、非同期関数は呼び出し側コードに事実上 Promise を返します。

以上がJavaScript の非同期関数はどのようにして常に Promise を返すのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。