![f14d0ed632b5cc549dc7446933b9d65c.png](https://i-blog.csdnimg.cn/blog_migrate/902492d45f2bfbd4e43c883983314160.jpeg)
async/await 这个语法特性功能强大,但是在forEach中使用,就有些捣蛋了。
先看示例:forEach.js
![f5ee5cb29b2185da658079a32949a957.png](https://i-blog.csdnimg.cn/blog_migrate/70cb0a1b348edd2b0e398def5894c67e.jpeg)
在 node.js (≥ 7.6.0)环境下运行这段代码, 结果是:
$ node forEach.js$ Done
Chrome76版本浏览器环境中,可以打印出数字,但是Done还是在最前边。
What???
console.log(num) 没有执行!!!
现在我们重写forEach(),来理解一下发生了什么
![02ec0bf797c6d8e5a5b1bb70722a4e66.png](https://i-blog.csdnimg.cn/blog_migrate/ea8ebd5d0cb795fecdaf605837eb7403.jpeg)
forEach() 专业严谨的pollyfill,请前往 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach#Polyfill
现在你会看到,callback会在进入下一次迭代之前,马上执行完,不会等待
要解决这个问题,我们自己写一个asyncForEach()方法
![79c23196898bd432f37a67d912af36a7.png](https://i-blog.csdnimg.cn/blog_migrate/bc05792152f8d0caf9f382fac569be67.jpeg)
然后更新上边那个示例:
![b466e416f41b4a2c630feb74fee126ed.png](https://i-blog.csdnimg.cn/blog_migrate/557265cc158564e689a537b5fe8b5d3a.jpeg)
同样在node中执行这段代码,我们可以看到:
$ node forEach.js$ Done$ 1$ 2$ 3
越来越接近正确答案了
其实,我们的asyncForEach()方法返回了一个Promise(被包装在了async定义语法里边)。现在还没有达到理想结果,在打印Done之前,还是没有等待每次迭代的打印
再次更新示例,这次把asyncForEach(),包装到async方法中,asyncForEach前边加await才可以等待:
![de9967cd1f5bcf190bcebd5b2ae734aa.png](https://i-blog.csdnimg.cn/blog_migrate/e124fb988924b3ca665f0a1402c07dce.jpeg)
最后一次执行,看结果:
$ node forEach.js$ 1$ 2$ 3$ Done
现在我们可以在forEach中正确使用async/await了
相关文章:
JS扩展运算符(Spread Operator)的5种用法
如何使用ES6语法给数组去重