Async/Await: Promise の謎を明らかにする
async/await 機能の領域に着手すると、興味深い難題に遭遇する可能性があります。 。非同期関数は常に Promise オブジェクトを返すため、コンソールに直接ログを記録しようとすると混乱が生じるようです。
この現象をさらに深く掘り下げて、その複雑さを解明してみましょう。すべての非同期関数は Promise パラダイムに準拠し、操作の結果をカプセル化する Promise オブジェクトを返します。 await ステートメントは、Promise が解決されるか拒否されるまで関数の実行を一時停止する手段として機能します。
await は Promise を自動的にアンラップすると考える人もいるかもしれませんが、そうではありません。 await を使用すると、関数は単に待機し、その後すぐに解決される Promise を返します。ただし、実際の結果にアクセスするには、await または .then() を使用して Promise を明示的にラップ解除する必要があります。
説明のために、非同期リクエストをシミュレートする次のコード スニペットを考えてみましょう。
const getJSON = async () => { const request = () => new Promise((resolve, reject) => ( setTimeout(() => resolve({ foo: 'bar'}), 2000) )); const json = await request(); return json; };
結果を直接コンソールに記録しようとすると、出力は次のようになります。 Promise:
console.log(getJSON()); // returns Promise
ただし、.then() を使用して Promise をアンラップすると、期待される JSON オブジェクトが明らかになります:
getJSON().then(json => console.log(json)); // prints { foo: 'bar' }
結論として、非同期関数は常に Promise を返し、await は単にサスペンドするだけです。解決するまで実行します。結果を取得するには、await または .then() を使用した明示的なアンラップが必要です。このメカニズムにより、Promise モデルの整合性が確保され、Promise の結果への直接アクセスが許可された場合に発生する可能性のある予期せぬ動作が防止されます。
以上がAsync/Await 関数が常に Promise を返すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。