我的脚本需要处理几个ajax请求。这是一个简化版本:
function request(variable){
$.ajax({
// call config
}).done(function(data){
// treatment of returned data
// returning TRUE (ok) or FALSE (errors)
}).fail(function(e){
// generating error message
});
}
我需要打几个电话:
request(variableA);
request(variableB);
request(variableC);
请求同时执行并且运行良好,但我不知道该过程何时完成。我无法显示返回的值。
有些讨论建议使用when()。
$.when(request(variableA), request(variableB), request(variableC))
.done(function(resultA, resultB, resultC) {
alert("Finished!");
//results available
});
使用此代码,警报似乎在过程的最开始时执行,而不是等待完成...
什么是我最好的选择?
答案 0 :(得分:4)
更改request
以返回承诺
function request(variable){
return $.ajax({
// call config
}).done(function(data){
// treatment of returned data
// returning TRUE (ok) or FALSE (errors)
}).fail(function(e){
// generating error message
});
}
答案 1 :(得分:2)
那些request()调用会立即返回,因为它们是 ASYNCHRONOUS (因此在AJAX中是A)。要将请求链接在一起并且仅在它们全部完成时执行某些操作,您必须让单独的ajax调用的成功处理程序递增计数器,然后仅在计数器达到某个点时调用“前进”代码。 e.g。
var alert_counter = 0;
function request('blahblah', alert_when_reached) {
$.ajax({
success: function() {
alert_counter++;
if(alert_when_reached >= alert_counter) {
proceed_onwards();
}
});
不是说这会按原样运作,但应该给你一个想法。如果你需要调用3个paralle请求,你将3
传递给每个请求,当第3个结果最终进入时,成功处理程序的特定实例将调用任何函数让你的代码继续前进。 / p>
一些小的改进是为成功处理程序定义一个闭包并将其传递给request()函数,因此你没有硬编码的“继续”函数调用,但这超出了这个答案的范围