我有很多嵌套的ajax请求,如下所示。我在下面的成功函数中有很多事情要做,我需要像成功那样在成功完成时触发。 complete(jqXHR, textStatus)
似乎与success
一起发射,我认为.ajaxComplete()
不起作用。
$.ajax({
url: 'api/periods.json',
dataType: 'json',
success: function (d1) {
//more nested ajax requests
},
});
解:
已创建名为$.ajax()
(已完成+ ajax)的$.fajax()
替换插件。请检查一下,让我知道你的想法。 https://github.com/reggi/fajax(这是很好的记录)。
答案 0 :(得分:2)
我不太完全确定你在问什么,所以请原谅我,如果我不合适,但我想你可能想要这样的东西:
$.ajax({
url: 'api/periods.json',
dataType: 'json',
success: function(d1){
//more nested ajax requests
},
}).done(function(msg){
alert("Every Ajax Call is Complete!");
});
答案 1 :(得分:2)
您可以为jQuery.ajax创建一个包装函数,使其更清晰:
var started = 0, done = 0;
var globalHandler = function(){
//do stuff when all success handlers are done
}
function handleAjax(args){
var _success = args.success || function(){};
args.success = function(jqXHR, textStatus){
_success(jqXHR, textStatus);
done++;
if(done >= started)
globalHandler();
}
var ajax = $.ajax(args);
started++;
return ajax;
}
使用
handleAjax({
url: 'api/periods.json',
dataType: 'json',
success: function (d1) {
//more nested ajax requests like this:
handleAjax({...});
}
});
这会创建一个闭包,所以不要在那里做任何疯狂的记忆密集的东西,你应该没事。
答案 2 :(得分:0)
您可能需要.queue()或.Deferred
$("#el").queue("queue_name",function(){
$.ajax({
url: 'api/periods.json',
dataType: 'json',
success: function(d1){
//more nested ajax requests
$("#el").dequeue("queue_name"); // tell queue success is complete
},
});
}).queue("queue_name",function(){
//do something you want when success is complete
})
$("#el").dequeue("queue_name"); // start to execute
或$ .Deferred()
$.ajax({
url: 'api/periods.json',
dataType: 'json',
success: function(d1){
var start = function(){
var dtd = $.Deferred();
//more nested ajax requests---------------
$.post("xxx",function(){
dtd.resolve(); // when success is complete
});
//----------------------------------------
return dtd.promise();
}
start.apply(this).pipe(function(){
//do something you want when success is complete
});
},
});