循环异步回调问题

我有一个数组:

var a = [0,1,2,3];

我需要遍历这个数组并且提交ajax,然后判断提交是否成功来确认是否执行下一个

a.forEach(function(item){
    $.ajax({
        type: "get",
        async: false,//设置为同步
        url: "test.html",
        data:item,
        success: function() {
            //do something
            //成功才执行下一个元素提交 
        }
    });
})

我查了一下,应该不能用循环写了,只能用手动回调,例如:

var tmp = a[0];
function f1(tmp){
    $.ajax({
        type: "get",
        async: false,//设置为同步
        url: "test.html",
        data: tmp,
        success: function() {
            //do something
            //成功才执行下一个元素提交
            tmp = a.splice(0,1)
            f1(tmp)
        }
    });
}

请问是否有更好的办法,或者有什么建议提示呢?谢谢.

阅读 2.7k
3 个回答

把ajax视作异步对象或者promise,用Promise库的一些工具来实现嘛

比如用Bluebird

Promise.each
Promise.mapSeries   

都是可以的

比如用Q这个库

[step1_func, step2_func, step3_func].reduce(Q.when, Q(true));

其实你的第二种方法就是挺正常的处理方式了。

首先你要弄清楚。
异步 == 非阻塞。
既然是非阻塞的,你肯定不能放在循环里面去做的。
一般都是用第二种方法做。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题