JavaScript异步仿同步(控制流)的实现

摘要:
在前端开发中,尤其是在nodejs开发中,我们经常遇到这样的场景:有三个Ajax请求,第二个请求依赖于第一个,第三个请求依赖第二个。然后我们可以在发送第一个Ajax后进行回调,然后执行第二个Ajax,然后在回调中执行第三个Ajax,这形成了一个回调金字塔,非常复杂。当然,有很多插件可以解决这个问题,例如Promise、async等。

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

免责声明:文章转载自《JavaScript异步仿同步(控制流)的实现》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Mysql查询字段与关键字重名Element UI Table合并行下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

JQuery ajax回调函数

转自http://zhengyh2008.blog.163.com/blog/static/13894713201003041633526/ jquery ajax 回调函数 返回值 js文件: $.ajaxSetup({ async: false }); function oncheck(oid){var rs=true;if(oid=="stunu...

关于for循环里面异步操作的问题

一、使用自执行函数   1、当自执行函数在循环当中使用时,自执行函数会在循环结束之后才会运行。比如你在自执行函数外面定义一个数组,在自执行函数当中给这个数组追加内容,你在自执行函数之外输出时,会发现这个数组当中仕么都没有,这就是因为自执行函数会在循环运行完后才会执行。   2、当自执行函数在循环当中使用时,要是自执行函数当中嵌套ajax,那么循环当中的下标...

如何查看Ajax请求

Ajax是一种异步JavaScript执行的方式。webpage向后台发出Get或者Post请求,后台返回网页请求,然后再刷新网页部分内容。 举两个例子: 1、有道词典是是翻译: http://fanyi.youdao.com/ 使用GoogleChrome浏览器,按F12,选择Network,XHR(XmlHttpResponse) 在翻译窗口输入文字,...

Array数组

数组主要是用来 存储一组数据的: 1、掌握如何创建数组 2、掌握数组元素的读和写 3、掌握数组的length属性 创建数组的基本方式有两种: 1、使用Array构造函数 语法:new Array() new 是新建创建的意思 小括号()说明: (1)预先知道数组要保存的项目数量 (2)向Array构造函数中传递数组应包含的项。 <script>...

window.open()打开的新窗口被拦截的原因分析和解决方案

1、原因: 浏览器检测到非用户操作产生的新弹出窗口,则会对其进行阻止。因为浏览器认为这可能是一个广告。 window.open()放在ajax的回调函数中执行会导致被拦截 2、解决方案: 先打开一个页面,在ajax回调函数中把当前页重定向到目标页面 // 打开一个页面 var newWin = window.open('about:blank'); /...

JavaScript里面Array.filter()的使用详解

1、前言 filter是JavaScript中Array的常用操作,用于把Array的某些元素过滤掉,然后返回剩下的元素。其主要原理是filter会把传入的函数依次作用于每个元素,然后根据返回值是 true 还是false决定保留还是丢弃该元素。 2、示例 (1)示例1,在一个Array中过滤掉小于2的数据,得到大于2的数据,如下代码: var arr...