使用jQuery解决循环中的promise

时间:2016-10-12 10:57:25

标签: javascript jquery promise

所以XHR在一个循环中运行,我希望在所有XHR完成后执行一个函数,我尝试使用promises如下。

var promises = [];
for(var i=0;i<5;i++){
    promise = $.ajax({
                    type: "POST",
                    url : data_url,
                    data:pdata
    });
    promises.push(promise);
}
$.when(promises).then(function(){
                window.location.href = '/cart?edit_order=true'
})

问题是重定向发生在AJAX完成之前,我错过了什么?

1 个答案:

答案 0 :(得分:2)

如果我没记错的话,jQuery的.when()方法并不接受promises的 Array 作为参数,而是接受单个参数。这只是意味着你需要改变调用它的方式:

$.when.apply( null, promises ).then(function(){
            window.location.href = '/cart?edit_order=true'
})

使用Function.prototype.apply将自动获取数组并将 Array 的每个值作为单个参数放入调用的函数中,在本例中为{{1 }}。有效地传播论据。

您还可以执行一些EMCAscript魔术并为此创建一个部分应用程序:

.when()

..然后只需致电

var when = Function.prototype.apply.bind( $.when, null );