繁体   English   中英

异步等待回调行为

[英]async-await callback behaviour

我试图了解回调的异步等待行为。 首先,让我们看一下这个函数:

const assert = require('assert')

async function promiseReturner() {
  return Promise.resolve(Promise.resolve(Promise.resolve(Promise.resolve(42))))
}

(async function() {
  assert.equal(await promiseReturner(), 42)
})()

这使我可以安全地得出结论,无论如何, await关键字始终可以解决承诺。

现在,这里有个函数可以在一秒钟后返回一个数字:

async function addTenAndReturnNumber(number) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(number)
    }, 1000)
  })
}

我对此进行了两个实验。 首先是forEach循环。

(async function() {
  let variable;
  const result = [41, 42, 43].forEach(async (number) => {
    variable = await addTenAndReturnNumber(number)
  })
  console.log(variable) // undefined
})()

好的,太好了。 似乎forEach回调在下一个刻度中求值,因此variable未定义(尽管这正是人们认为await不应该做的事情)。 接下来尝试map

(async function() {
  const result = [41, 42, 43].map(async (number) => {
    return await addTenAndReturnNumber(number)
  })
  console.log(result) // [Promise {}, Promise {}, Promise {}]
})()

我假设它会返回[51, 52, 53] ,或者像之前一样undefined

请注意,我的问题与行为有关,为什么要这样设计-规范方面是否有意识地做出决定? 我知道我可以使用for...ofPromise.all

谢谢!

async函数总是返回一个承诺(如果您await该承诺,您将获得其实际值)。

async函数传递给map()将返回一个async函数返回的数组,这当然是一个承诺。

您的forEach()回调会立即运行,但是一旦到达await ,它将仅在promise解析后(保证在您的代码完成运行之后)继续运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM