Javascript forEach中的异步函数在之前的const声明时执行
我有一个奇怪的javascript行为,我无法解释。 当我跑的时候Javascript forEach中的异步函数在之前的const声明时执行,javascript,async-await,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 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
),它将记录
你能解释一下原因吗?第一行缺少一个分号。如果没有分号,代码将被解析为:
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)
,代码将失败-我们可以看到这里的逗号被解析为:
添加一个
afterwaitFor=…
当我添加分号时,它对我有效:const waitFor=(ms)=>newpromise(r=>setTimeout(r,ms))代码>@Andreas,抓得好,为什么代码>此处重要?请参阅中的说明Kobi@rocketer-我添加了一个解释发生了什么的答案。我建议你把分号从问题中去掉,因为这才是真正的问题,而这个问题在这种形式下不起作用。
(ms) => new Promise(r => setTimeout(r, ms))
// const o = 2;
[1, 2, 3].forEach(async (num) => {
await waitFor(50);
window.runnerWindow.proxyConsole.log(num);
})
TypeError: (new Promise(...))[3] is undefined