簡體   English   中英

等待沒有做我期望的

[英]await not doing what I expect

async function doThings() {
    async function timer () {
        setTimeout(() => {
            console.log('timer!')
        }), 1000
    }
    
    async function printer () {
        console.log('printer!')
    }

    await timer()
    await printer()
}

doThings()

我認為使函數異步使其返回承諾並等待使其等待。 為什么打印機()首先完成?

您的timer功能不起作用,因為 setTimeout 不返回可以等待的承諾。 您需要手動承諾它:

// set a default of 1500
function timeout(ms=1500) {
  return new Promise(resolve => setTimeout(resolve, ms));
};

async function printer() {
  console.log('printer!');
};

async function doThings() {
  await timeout(1000); // time in ms
  await printer();
};

doThings();

我只能看到 timer () 和 printer () 函數是異步函數,但是它們中沒有使用 await,這使得 async 關鍵字不起作用。

函數前面的“async”一詞意味着一件簡單的事情:函數總是返回一個 Promise。 其他值會自動包裝在已解決的 Promise 中。

現在當我們使用 don't return Promise from async function 時,javascript 解釋器會自動返回已解決的 Promise,這就是 await on timer 函數得到已解決的 Promise 並且解釋器繼續執行的原因,但是 setTimeout 仍在繼續. 所以我們必須從計時器函數返回一個 Promise,並在 setTimeout 函數中解析它,如下所示。

async function doThings() {

    async function timer() {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                console.log(`timer!`);
                resolve();
            }, 1000)
        });
    }

    async function printer() {
        console.log('printer!')
    }

    await timer()
    await printer()
}

doThings()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM