Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.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 forEach中的异步函数在之前的const声明时执行_Javascript_Async Await - Fatal编程技术网

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

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无法

我有一个奇怪的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
),它将记录


你能解释一下原因吗?

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

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)
,代码将失败-我们可以看到这里的逗号被解析为:


添加一个
after
waitFor=…
当我添加分号时,它对我有效:
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