首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >async-await回调行为

async-await回调行为
EN

Stack Overflow用户
提问于 2018-01-03 04:24:54
回答 1查看 66关注 0票数 0

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

代码语言:javascript
运行
复制
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关键字总是解析承诺。

下面是一个函数,它在一秒钟后返回一个数字:

代码语言:javascript
运行
复制
async function addTenAndReturnNumber(number) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(number)
    }, 1000)
  })
}

我用这个做了两个实验。首先是forEach循环。

代码语言:javascript
运行
复制
(async function() {
  let variable;
  const result = [41, 42, 43].forEach(async (number) => {
    variable = await addTenAndReturnNumber(number)
  })
  console.log(variable) // undefined
})()

好的,太棒了。看起来forEach回调是在下一次计算中计算的,因此variable是未定义的(尽管这正是人们认为await不应该做的事情)。接下来让我们尝试一下map

代码语言:javascript
运行
复制
(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

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-03 04:28:05

async函数总是返回一个promise (如果您await promise,就会得到它的实际值)。

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48067374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档