博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js中forEach回调同异步问题
阅读量:6612 次
发布时间:2019-06-24

本文共 967 字,大约阅读时间需要 3 分钟。

js中forEach本身是同步的

举个栗子:

[many, too many, so many].forEach((value) => {    some code;  //  这是一个大数值运算(非异步代码),需要几毫秒的时间});other code;  // 这些代码将会阻塞,等到forEach循环完之后执行

这是回调中没有异步代码的情况。

再举一个有异步的

[1, 2, 3].forEach((value) => {    setTimeout(function() {        some code;    }, 1000);});other code; // 这部分代码不会被setTimeout阻塞,forEach遍历完1,2,3之后就执行[1, 2, 3].forEach( async (value) => {    let foo = await promiseFn();});other code; // 同样不会受到异步阻塞

上面是2种异步代码形式, 但是都不会阻塞后面的代码。我理解的是:forEach的回调函数会被立即执行,回调里有异步代码,根据EventLoop机制放入调用栈,继续执行同步代码以结束; 回调本身就是异步函数,放入调用栈,结束本次遍历。

结合代码理解:

Array.prototype.forEach = function (callback) {    for(let index = 0; index < this.length; index++) {        callback(this[index], index, this);    }}

对于常规for循环

const sleep = (timer) => {    return new Promise((resolve, reject) => {        setTimeout(resolve, timer);    });}const foo = async () => {    for (let i = 0; i < 5; i++) {        await sleep(1000);        console.log(i);    }}foo(); // 从1到5,每隔一秒输出一个数字

转载地址:http://geaso.baihongyu.com/

你可能感兴趣的文章
ToughRADIUS快速指南
查看>>
HTML
查看>>
【转】左手坐标系和右手坐标系
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
POJ 3335 Rotating Scoreboard 半平面交
查看>>
window.location.href和window.location.replace的区别
查看>>
《Gamestorming》读书笔记
查看>>
域名和网址链接被微信浏览器拦截怎么办 微信屏蔽网址打开如何解决
查看>>
使用SQL Server Analysis Services数据挖掘的关联规则实现商品推荐功能(二)
查看>>
ubuntu下安装jdk
查看>>
C/S与B/S架构比较
查看>>
XML学习总结(2)——XML简单介绍
查看>>
python操作数据库-安装
查看>>
你真的了解interface和内部类么
查看>>
java中常用的类型转换
查看>>
【log4j】使用Log4j?,slf4j更轻巧高效
查看>>
kuangbin专题七 POJ3264 Balanced Lineup (线段树最大最小)
查看>>
JS动画效果链接汇总
查看>>
父类转为子类涉及到的安全问题
查看>>