Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 异步等待回调行为_Javascript_Asynchronous_Promise_Async Await - Fatal编程技术网

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:为什么会设置为承诺?你从不把它分配给任何可以成为承诺的东西。我现在明白了。感谢您的沉默并表示歉意:-)