我有以下方法进行ajax调用,并且此方法从另一个函数多次调用,因此最终会进行多个ajax异步调用。我需要在所有异步ajax调用完成后才执行某些任务。
var makeAjaxCall = function() {
var ret = new $.Deferred();
$.ajax({
type: 'GET',
url: url,
dataType: 'json'
})
.done(function(data, textStatus, jqXHR) {
//do stuff
ret.resolve(data);
})
.fail(function(jqXHR, textStatus) {
// do stuff
})
.always(function() {
//do stuff
});
return ret;
};
此函数从for循环遍历对象的for循环中调用。
var items = ['a', 'b', 'c'];
for (var i = 0; j < items.length; j++) {
makeAjaxCall();
}
现在我正在执行等待所有触发的ajax调用完成的任务。
$.when(makeAjaxCall()).then(function(ret) {
// perform the task
});
问题是,deferred.when()中的'then'部分没有被调用,并且没有执行该任务。我错过了什么?
答案 0 :(得分:0)
$.ajax
已经返回成功完成时解析的promise,因此您不需要额外的延迟。只需return $.ajax
。
最重要的是$.when
接受可变参数 - 所有延迟,但不是数组。如果要使用数组,则必须使用.apply
。
var arrayOfPromises = items.map(item => {
// Do you need to pass in `item` or something?
return makeAjaxCall();
});
$.when.apply($, arrayOfPromises).then(() => {
// perform task
});