【问题标题】:await not doing what I expect等待不做我期望的事情
【发布时间】:2020-09-30 15:40:04
【问题描述】:
async function doThings() {
    async function timer () {
        setTimeout(() => {
            console.log('timer!')
        }), 1000
    }
    
    async function printer () {
        console.log('printer!')
    }

    await timer()
    await printer()
}

doThings()

我认为使函数异步使其返回一个承诺并等待使其等待。为什么printer()先完成?

【问题讨论】:

    标签: javascript asynchronous async-await


    【解决方案1】:

    您的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();
    

    【讨论】:

      【解决方案2】:

      函数前面的“异步”一词意味着一件简单的事情:函数总是返回一个 Promise。其他值会自动包装在已解析的 Promise 中。

      现在当我们使用don't return Promise from async function时,javascript解释器会自动返回resolved Promise,所以这就是定时器函数的await得到resolved 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()
      

      【讨论】:

      • 因此,如果我们没有从异步函数显式返回一个承诺,它会自动返回一个已解决的承诺,这使得等待无法立即解决?我想我明白了,但这有什么用呢?
      • 是的,如果函数没有明确返回,则异步函数返回已解决的承诺,因此调用者 await 会立即解决它。是的,它只是更好的可读性和易于使用 Promises,仅此而已。它与在返回的 Promise 上使用 then 一样好。但是 Promises 中的链接使代码更难阅读。 Async/await 使代码更简单。让我们仅以您的代码为例,它看起来像这样 --- timer().then(function successmethod(){ printer() },function failuremethod(){})
      【解决方案3】:

      我只能看到 timer () 和 printer () 函数是异步函数,但它们中没有使用 await,这使得 async 关键字不起作用。

      【讨论】:

        猜你喜欢
        • 2014-07-23
        • 1970-01-01
        • 1970-01-01
        • 2017-02-03
        • 1970-01-01
        • 1970-01-01
        • 2021-09-15
        • 1970-01-01
        • 2020-02-02
        相关资源
        最近更新 更多