forEach中的异步函数在执行const声明之前执行

时间:2018-06-13 11:44:45

标签: javascript async-await

我有一个奇怪的javascript行为,我无法解释。 我跑的时候

const waitFor = (ms) => new Promise(r => setTimeout(r, ms))

// const o = 2;

[1, 2, 3].forEach(async (num) => {
  await waitFor(50);
  console.log(num);
});

console.log('Done');

它只记录Done。这是预期的,因为forEach无法获得异步回调。

但是,如果您取消注释行const o = 2(未使用o),则会记录

Done
1
2
3

你能解释一下原因吗?

1 个答案:

答案 0 :(得分:3)

第一行缺少分号。如果没有分号,代码将被解析为:

const waitFor = (ms) => new Promise(r => setTimeout(r, ms))[1,2,3].forEach( ... )

如果您这样做,可以进行验证:

console.log(waitFor);

打印以控制完整代码,而不仅仅是第一行:

(ms) => new Promise(r => setTimeout(r, ms))

// const o = 2;

[1, 2, 3].forEach(async (num) => {
await waitFor(50);
window.runnerWindow.proxyConsole.log(num);
})

数组声明和forEach循环包含在lambda中,永远不会运行。

如果您尝试启动lambda,例如使用waitFor(6),则代码将失败 - 我们可以看到此处逗号被解析为comma operator

TypeError: (new Promise(...))[3] is undefined