async-await回调行为

问题描述 投票:0回答:1

我试图理解async-await回调行为。首先,让我们来看看这个函数:

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回调在下一个tick中进行了评估,因此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

谢谢!

javascript asynchronous promise async-await
1个回答
3
投票

async函数总是返回一个承诺(如果你await承诺,你将得到它的实际价值)。

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

你的forEach()回调会立即运行,但是一旦它到达await,它只会在promise解析后恢复运行(保证在你的代码完成运行之后)。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.