在前端开发中尤其是在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);
});

最新文章

  1. eclipse关联源码 Failed to create the part's controls
  2. Codeforces Round #283 (Div. 2)
  3. DOS 全集
  4. PHP 运算符 详解
  5. BZOJ 2535 Plane 航空管制2
  6. HTML5 file api读取文件的MD5码工具
  7. Dev的GridControl控件选择框的使用
  8. openstack私有云布署实践【14.2 登录页dashboard-controller(办公网环境)】
  9. InnoDB锁
  10. (详细)华为P8 GRA-UL00的Usb调试模式在哪里开启的方法
  11. jemter 新增sha256函数
  12. go语言异常处理
  13. php 静态方法 静态属性 和 普通方法 普通属性区别
  14. flask你一定要知道的上下文管理机制
  15. C++ mysql 乱码
  16. Java Session 会话技术
  17. 51nod 1042 数字0-9的数量 数位dp
  18. 【数据结构与算法】003—排序算法(Python)
  19. jQuery学习-键盘事件
  20. Centos7环境下消息队列之ActiveMQ实战

热门文章

  1. 【转】Visual Studio 选择相同变量高亮
  2. react中虚拟DOM的基本概念
  3. LeetCode.897-递增搜索树(Increasing Order Search Tree)
  4. C 语言实例 - 字符串复制
  5. Eclipse 修改编码方式
  6. POI刷题记录
  7. JSP && Servlet | 上传图片到数据库
  8. bzoj 5449 序列
  9. 537 Complex Number Multiplication 复数乘法
  10. linux分配文件文件夹所属用户及组