[英]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...of
或Promise.all
谢谢!
async
函数总是返回一个承诺(如果您await
该承诺,您将获得其实际值)。
将async
函数传递给map()
将返回一个async
函数返回的数组,这当然是一个承诺。
您的forEach()
回调会立即运行,但是一旦到达await
,它将仅在promise解析后(保证在您的代码完成运行之后)继续运行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.