Javascript 为什么我可以在for…of循环中使用wait关键字

Javascript 为什么我可以在for…of循环中使用wait关键字,javascript,async-await,Javascript,Async Await,编辑:请仔细阅读。这确实有效。我正试图弄清楚原因 编辑2:我知道异步使事情变得异步。为什么这个循环不适用于for…in循环呢 我使用的是节点v10.13.0 一段时间以来,我一直在使用Javascript中的For…of循环在循环结构中执行异步任务。我毫不怀疑它正在按预期工作 我只是遇到了一个情况,我必须解释为什么这是工作,并意识到我其实不知道。下面是一个复杂的示例,旨在帮助您直观地理解我的意思: async function myFunc(array) { for (var item

编辑:请仔细阅读。这确实有效。我正试图弄清楚原因

编辑2:我知道异步使事情变得异步。为什么这个循环不适用于for…in循环呢

我使用的是节点v10.13.0

一段时间以来,我一直在使用Javascript中的For…of循环在循环结构中执行异步任务。我毫不怀疑它正在按预期工作

我只是遇到了一个情况,我必须解释为什么这是工作,并意识到我其实不知道。下面是一个复杂的示例,旨在帮助您直观地理解我的意思:

async function myFunc(array) {
    for (var item of array) {
        await asyncRequest();
    }
}
在这个函数中,
array
asyncRequest
是什么并不重要,关键是对于数组中的每个项目,程序执行在经过循环之前以一种看似连续的方式执行每个
asyncRequest

我看了一下,我发现for…of循环在iterable对象上迭代。数组是绝对可写的,但这一事实似乎无关


了解这种行为吗?

异步
和等待
机制是通过将承诺与生成器函数相结合来实现的。
async
函数中的每个
wait
,就像生成器中的一个
yield
。代码的转换是在解析代码时处理的,因此您不必自己处理这些


这意味着在
async
函数中,
await
可以出现在任何地方:如您所知,在
函数中。。。循环的,但也在循环的内部,用于。。。在
loops中,对于
loops,
loops,无论什么都可以。如果你仔细阅读生成器函数,你会发现在某种意义上,它是完全并行的,
yield
可以出现在任何地方。所以,
对于。。。of
循环毫无特殊之处,而且(正如您所怀疑的)它们的行为和语义与
await
在这样一个循环体中的含义无关。

这就是
async
await
被设计用来做的;换句话说,这种行为才是关键。我知道它是有效的。我只是不知道为什么。那为什么不去工作呢?为什么只是为了……的?
为了。。。在
中也会起作用,就像一个普通的
for
循环,或者一个
while
循环,等等。我想我只是不清楚混淆的是什么——为什么你认为,
for…in
不起作用?你也可以看看由
再生器运行时生成的代码,看看异步等待的流程是什么样子。它是为不支持它的平台生成的异步等待。谢谢-这给了我下一步应该学习的方向。我很感激!