web-dev-qa-db-ja.com

値の代わりにpromiseを返す非同期関数

私はasync/awaitが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;
}
const time = latestTime(); // Promise { <pending> }

問題

私が理解している限り、awaitはブロックする必要があり、上のコードでは、プリミティブblを持つオブジェクトtimestampを返すことをブロックしているようです。次に、関数はプリミティブ値を返しますが、時間変数はそのプリミティブの代わりに保留中のpromiseに設定されます。何が欠けていますか?

5
user3223162

非同期プレフィックスは、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;
}

と同じです

function latestTime() {
    return new Promise(function(resolve,success){
        const bl = web3.eth.getBlock('latest');
        bl.then(function(result){
            console.log(result.timestamp); // Returns a primitive
            console.log(typeof result.timestamp.then == 'function'); //Returns false - not a promise
            resolve(result.timestamp)
        })
}
9
Andrei Iashchak

async関数はとにかくPromiseを返します。戻り値は `Promiseなので、あなたの場合は次のようになります:

async function latestTime(): Promise<some primitive> {
  const bl = await web3.eth.getBlock('latest');
  return bl.timestamp;
}

したがって、さらに次のような関数を使用できます。

const time = await latestTime();

しかし、async/await機能ドキュメントを読む方が良いでしょう。

5
Oleksii