我试图通过回调来理解异步等待行为。首先,让我们看一下这个函数:
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...of
或Promise.all
谢谢!
发布于 2018-01-03 04:28:05
async
函数总是返回一个promise (如果您await
promise,就会得到它的实际值)。
将async
函数传递给map()
将返回async
函数返回的数组,这当然是一个promise。
您的forEach()
回调会立即运行,但是一旦它到达await
,它只会在promise解析之后才会恢复运行(这肯定是在您的代码完成运行之后)。
https://stackoverflow.com/questions/48067374
复制相似问题