如何累积来自各种AJAX调用的数据?

Xay*_*Xay 5 javascript ajax jquery

如果可以并且认为它是合适的,那么除了进行同步AJAX调用之外,处理这样的事情的最佳方法是什么?

var A = getDataFromServerWithAJAXCall(whatever);
var B = getDataFromServerWithAJAXCallThatDependsOnPreviousData(A);
var C = getMoreDataFromServerWithAJAXCall(whatever2);

processAllDataAndShowResult(A,B,C);
Run Code Online (Sandbox Code Playgroud)

假如我可以通过回调来这些功能,我知道我可以使用关闭和lambda表达式来得到这样做的工作:

var A,B,C;

getDataFromServerWithAJAXCall(whatever, function(AJAXResult) {
    A= AJAXResult;
    getDataFromServerWithAJAXCallThatDependsOnPreviousData(A, function(AJAXResult2) {
        B= AJAXResult2;
        processAllDataAndShowResult(A,B,C);
    });
});
getMoreDataFromServerWithAJAXCall(whatever2, function(AJAXResult) {
    C= AJAXResult;
    processAllDataAndShowResult(A,B,C);
});

function processAllDataAndShowResult(A,B,C) {
    if(A && B && C) {
        //Do stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

但它对我来说感觉不对或不够干净.那么有更好的方法或至少更简洁的方式来做同样的事情,还是只是我不习惯javascript函数式编程?

顺便说一下,如果有帮助的话,我正在使用jQuery(1.4.2).

谢谢.

Séb*_*rra 5

是的,jQuery的Deferred Object非常方便.

以下是$.when()功能文档中的示例,说明了您的问题的解决方案:

$.when($.ajax("/page1.php"), $.ajax("/page2.php")).done(function(a1,  a2){
    /* a1 and a2 are arguments resolved for the 
        page1 and page2 ajax requests, respectively */
   var jqXHR = a1[2]; /* arguments are [ "success", statusText, jqXHR ] */
   if ( /Whip It/.test(jqXHR.responseText) ) {
      alert("First page has 'Whip It' somewhere.");
   }
});
Run Code Online (Sandbox Code Playgroud)

干杯!


Mar*_*man 0

如果您可以使用 jQuery 1.5,您应该能够通过使用延迟对象来满足您的需求$.when()

$.when(getDataFromServerWithAJAXCall("Call 1"), getMoreDataFromServerWithAJAXCall("Call 2")).done(function(a1, a2) {
    var jqXHR = a1[2];
    jqXHR.responseText;
    getDataFromServerWithAJAXCallThatDependsOnPreviousData(jqXHR.responseText);
});
Run Code Online (Sandbox Code Playgroud)

简单地说,当前两个函数完成后,它将执行第三个函数。

jsfiddle 上的示例