Javascript 异步等待回调行为
我试图理解回调的异步等待行为。首先,让我们看看这个函数:Javascript 异步等待回调行为,javascript,asynchronous,promise,async-await,Javascript,Asynchronous,Promise,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) })()
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回调在下一个刻度中进行了计算,因此变量
是未定义的(尽管这正是人们认为等待
不应该做的)。让我们尝试map
下一步:
(async function() {
const result = [41, 42, 43].map(async (number) => {
return await addTenAndReturnNumber(number)
})
console.log(result) // [Promise {}, Promise {}, Promise {}]
})()
我假设它要么返回[51,52,53]
,要么像以前一样返回未定义的
请注意,我的问题是行为,为什么这样设计——这是规范的一个有意识的决定吗?我知道我可以为……使用或承诺。所有
谢谢 async
函数总是返回一个承诺(如果等待该承诺,您将得到它的实际值)
将async
函数传递给map()
将返回async
函数返回的数组,这当然是一个承诺
您的forEach()
回调会立即运行,但一旦它点击了wait
,它只会在承诺解析后(保证在代码完成运行后)恢复运行。async
函数总是返回一个承诺(如果您wait
承诺,您将得到它的实际值)
将async
函数传递给map()
将返回async
函数返回的数组,这当然是一个承诺
您的forEach()
回调立即运行,但一旦它点击await
,它将仅在承诺解决后(保证在您的代码完成运行后)恢复运行。关键字await
不会返回承诺。你的意思是async
?我的意思是await
总是返回承诺的结果(可能resolve是一个错误的词语选择?)。删除addTenAndReturnNumber()前面的async
。你基本上是把一个承诺封装在一个承诺中。@KarthikIyengar:是的<代码>等待
返回承诺的值。那又怎样?wait
关键字永远不会返回承诺。你的意思是async
?我的意思是await
总是返回承诺的结果(可能resolve是一个错误的词语选择?)。删除addTenAndReturnNumber()前面的async
。你基本上是把一个承诺封装在一个承诺中。@KarthikIyengar:是的<代码>等待
返回承诺的值。那又怎样?你能详细解释一下为什么forEach示例中的变量没有设置为43吗?@KarthikIyengar:为什么会设置为承诺?你从不把它分配给任何可以成为承诺的东西。我现在明白了。感谢并为其愚蠢表示歉意:-)您能详细说明一下为什么forEach示例中的变量没有设置为43吗?@KarthikIyengar:为什么会设置为承诺?你从不把它分配给任何可以成为承诺的东西。我现在明白了。感谢您的沉默并表示歉意:-)