如何处理几个ajax请求?

时间:2013-02-15 18:32:12

标签: jquery ajax callback jquery-deferred

我的脚本需要处理几个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
    });

使用此代码,警报似乎在过程的最开始时执行,而不是等待完成...

什么是我最好的选择?

2 个答案:

答案 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()函数,因此你没有硬编码的“继续”函数调用,但这超出了这个答案的范围