web-dev-qa-db-ja.com

async / awaitは常にpromiseを返します

私は非同期/待機機能を試しています。私はリクエストを模倣するそのようなコードを持っています:

_const getJSON = async () => {
  const request = () => new Promise((resolve, reject) => (
    setTimeout(() => resolve({ foo: 'bar'}), 2000)
  ));

  const json = await request();
  return json;
}
_

このようにコードを使用すると

_console.log(getJSON()); // returns Promise
_

それは約束を返します

しかし、このコード行を呼び出すと

_getJSON().then(json => console.log(json)); // prints { foo: 'bar' }
_

期待どおりにjsonを出力します

console.log(getJSON())のようなコードだけを使用することは可能ですか?何がわからないの?

26
user3309314

すべてのasync関数はPromiseオブジェクトを返しますawaitステートメントはPromiseで動作し、Promiseresolvesまたはrejectsまで待機します。

そのため、awaitを使用しても、非同期関数の結果に対して_console.log_を直接実行することはできません。 awaitを使用すると、関数が待機し、すぐに解決されるPromiseが返されますが、Promiseのラップは解除されません。 Promise関数または.then()を使用して、async関数によって返されたawaitをアンラップする必要があります。

_console.log_ gingの代わりに.then()を直接使用すると、.then()メソッドはPromiseの結果を利用できるようにします。ただし、PromiseのoutsideからPromiseの結果を取得することはできません。これは、Promiseでの作業モデルの一部です。

41
Pedro Castilho

非同期関数の戻り値 は常に AsyncFunctionオブジェクト になり、呼び出されるとPromiseを返します。その戻り値の型を変更することはできません。 async/awaitのポイントは、非同期関数内で他の非同期プロセスが完了するのを簡単に待つことです。

1
Ozan