ホームページ >ウェブフロントエンド >jsチュートリアル >非同期 JavaScript 関数がプリミティブ値を返す場合でも常に Promise を返すのはなぜですか?

非同期 JavaScript 関数がプリミティブ値を返す場合でも常に Promise を返すのはなぜですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-18 15:05:13583ブラウズ

Why Do Async JavaScript Functions Always Return Promises, Even When Returning Primitive Values?

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 構文は、いくつかの重要な点を強調しています:

  • Promise Executor 関数 (新しい Promise に渡される) は同期的に実行されます。これが、web3.eth.getBlock の理由です。
  • Promise Executor 内でスローされたエラーまたはそのコールバックが捕捉されます。そして約束の拒否として伝播します。

以上が非同期 JavaScript 関数がプリミティブ値を返す場合でも常に Promise を返すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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