JavaScript异步仿同步(控制流)的实现
2024-10-21 11:45:14
在前端开发中尤其是在nodejs开发中经常会遇到这样的场景(以ajax为例):有3个(或者更多个)Ajax请求,并且第2个请求依赖于第1个,第3个请求依赖于第2个,那我们可能就会在发第一个Ajax后回调再执行第二个Ajax,第二个执行后再在回调里面执行第三个,如此就形成了回调金字塔了,也显得复杂,当然这种问题也有许多插件,如:Promise、async等。 自己写了一个简单的实现方法:
/**
* 控制流/同步
* @param {Array} arr
* @param {Function} callback1 传递两个参数 (item,next),执行完一项则需执行next()才能执行下一项
* @param {Function} callback2 出错或执行完时回调
* @returns {*}
*/
function async (arr, callback1, callback2) {
if (Object.prototype.toString.call(arr) !== '[object Array]') {
return callback2(new Error('第一个参数必须为数组'));
}
if (arr.length === 0)
return callback2(null);
(function walk(i) {
if (i >= arr.length) {
return callback2(null);
}
callback1(arr[i], function () {
walk(++i);
});
})(0);
}
使用示例:
var arr = ['/a', '/b', '/c', '/d'];
async(arr, function(item, next){
$.ajax({
url:item,
complete:function(){
next();
}
});
},function(err){
console.log(err);
});
最新文章
- eclipse关联源码 Failed to create the part's controls
- Codeforces Round #283 (Div. 2)
- DOS 全集
- PHP 运算符 详解
- BZOJ 2535 Plane 航空管制2
- HTML5 file api读取文件的MD5码工具
- Dev的GridControl控件选择框的使用
- openstack私有云布署实践【14.2 登录页dashboard-controller(办公网环境)】
- InnoDB锁
- (详细)华为P8 GRA-UL00的Usb调试模式在哪里开启的方法
- jemter 新增sha256函数
- go语言异常处理
- php 静态方法 静态属性 和 普通方法 普通属性区别
- flask你一定要知道的上下文管理机制
- C++ mysql 乱码
- Java Session 会话技术
- 51nod 1042 数字0-9的数量 数位dp
- 【数据结构与算法】003—排序算法(Python)
- jQuery学习-键盘事件
- Centos7环境下消息队列之ActiveMQ实战