setTimeout使用异步等待关键字,但不知道它如何工作

时间:2018-10-18 15:49:16

标签: ecmascript-6 async-await settimeout

我正在使用javascript编程,但偶然发现了此代码,我想知道下面的代码如何以及为什么起作用:

var test = async () => {
  console.log("before");
  await setTimeout(() => {
    console.log("after");
  }, 1000);

};
test();

它是这样的:

  1. “之前”
  2. “之后”

这是示例代码,但是我的问题是这如何工作? setTimeout()不会返回Promise(我认为),因此异步/等待对应该不起作用或者是我缺少的东西?

2 个答案:

答案 0 :(得分:3)

嗯,它不起作用

async function test() {
  console.log("before");
  await setTimeout(() => {
    console.log("callback");
  }, 1000);
  console.log("after");
}
test();

您将收到before-after-callbackawait不会停止任何事情,因为-正如您所认识到的-setTimeout不会返回承诺。它等待undefined并继续下一条语句。您的示例只是缺少下一条语句,因此看不到任何区别。这是一个工作示例:

function delay(t) {
    return new Promise(resolve => setTimeout(resolve, t));
}
async function test() {
  console.log("before");
  await delay(1000);
  console.log("after");
}
test();

答案 1 :(得分:-2)

按照MDN Web Docs

  

如果await运算符后面的 expression 的值不是Promise,则将其转换为解析的Promise。

因此,await setTimeout表达式将转换为已解决的Promise。