【问题标题】:await setTimeout is not synchronously waitingawait setTimeout 没有同步等待
【发布时间】:2020-12-05 21:44:24
【问题描述】:

我知道setTimeout 是一个异步运行的API,我想同步运行它。像下面这样使用async/await 应该首先打印bla bla,但我首先得到bla

  async function testing(){
    console.log("testing function has been triggered");
      await setTimeout(function () {
        console.log("bla bla")
      }, 4200)
    console.log("bla");
  }

【问题讨论】:

  • await 只有在你 await 承诺时才会做任何有用的事情。因为setTimeout() 没有返回一个promise(它返回一个timerID),你的await 在这里什么都不做。您可以将setTimeout() 包装在一个小函数中,该函数返回一个在计时器触发时解析的承诺,并改用该包装器。这仍然不是真正意义上的同步,但函数执行会在内部暂停。

标签: node.js asynchronous promise async-await


【解决方案1】:
async function testing(){
  console.log("testing function has been triggered");
   console.log(await printFunction());
  console.log("bla");
}

function timeout(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

const printFunction = async () => {
  await timeout(4200);
  return "bla bla"
}

testing();

如果解决了您的问题,请支持回答,谢谢。

【讨论】:

    【解决方案2】:

    setTimeout 不返回 Promise,所以你不能 await 它。

    您可以将setTimeout 包装在一个返回Promise 的函数中,该函数在计时器到期后执行。你可以await这个包装函数。

    function createCustomTimeout(seconds) {
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          console.log('bla bla');
          resolve();
        }, seconds * 1000);
      });
    }
    
    async function testing() {
      console.log('testing function has been triggered');
      await createCustomTimeout(4);
      console.log('bla');
    }
    
    testing();

    【讨论】:

      猜你喜欢
      • 2019-10-16
      • 2021-11-12
      • 2018-09-23
      • 1970-01-01
      • 2019-06-03
      • 2018-09-28
      • 1970-01-01
      相关资源
      最近更新 更多