1

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

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

我最好的选择是什么?

4

2 回答 2

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
    });
}
于 2013-02-15T18:36:13.957 回答
2

这些 request() 调用无论如何都会立即返回,因为它们是异步的(因此 AJAX 中的 A)。要将请求链接在一起并仅在它们全部完成后才执行某些操作,您必须让各个 ajax 调用的成功处理程序增加一个计数器,然后仅在计数器达到某个点时才调用“继续”代码。例如

var alert_counter = 0;
function request('blahblah', alert_when_reached) {
$.ajax({
     success: function() { 
        alert_counter++;
        if(alert_when_reached >= alert_counter) {
           proceed_onwards();
        }
     });

并不是说这会按原样工作,而是应该给你这个想法。如果您需要调用 3 个并行请求,则传入3每个请求,当第三个结果最终出现时,成功处理程序的特定实例将调用任何让您的代码继续执行的函数。

一些小的改进是为成功处理程序定义一个闭包并将其传递给 request() 函数,因此您没有硬编码的“继续”函数调用,但这超出了此答案的范围。

于 2013-02-15T18:36:22.843 回答