web-dev-qa-db-ja.com

関数からのasync-awaitを使用して非同期関数から値を返す方法は?

非同期関数から値を返すにはどうすればよいですか?私はこれを好きにしようとしました

const axios = require('axios');
async function getData() {
    const data = await axios.get('https://jsonplaceholder.typicode.com/posts');
    return data;
}
console.log(getData());

これが返ってくる

Promise { <pending> }
20
King Rayhan

awaitスコープの外にasyncを指定することはできません。期待される結果を得るには、console.logを非同期IIFEにラップする必要があります。

async function getData() {
  return await axios.get('https://jsonplaceholder.typicode.com/posts');
}

(async () => {
  console.log(await getData())
})()

Worked サンプル。

async/await に関する詳細情報

axiosはpromiseを返すため、getData関数のasync/awaitは次のように省略できます。

function getData() {
  return axios.get('https://jsonplaceholder.typicode.com/posts');
}

そして、前と同じようにします

(async () => {
   console.log(await getData())
})()
22
The Reason

関数getDataはPromiseを返します。

次のいずれかを実行できます。

  • await関数も結果を取得します。ただし、awaitを使用できるようにするには、async関数を使用する必要があるため、これを「ラップ」する必要があります。

    async function callAsync() {
       var x = await getData();
       console.log(x);
    }
    callAsync();
    

    (わかりやすくするために関数に名前を付けましたが、このシナリオでは、匿名の関数呼び出しを使用したい場合があります。TheReasonの answer を参照してください。)

または

  • 結果を通常のPromiseとして使用します。これは、非同期関数が返すものです。
    コールバックでthenを使用する必要があります。

    getData().then(x => { 
        console.log(x); 
    }
    
5
Pac0

他の答えはこの罰金をカバーしています。しかし、グローバルスコープで実行するのではなく、main関数を作成して呼び出す習慣を身に付けて言いたいと思います。つまり.

async main(){
  let result = await getData();
}

main().catch(console.log);

これは、コードを読んでいる人なら誰でも、これがあなたのアプリエントリポイントであることは明らかです。

3
Meirion Hughes