我有一个奇怪的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
你能解释一下原因吗?
答案 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