2013-04-22 240 views
1

我工作的一個網站,並在我的代碼中的一些觀點,我做了一些AJAX調用:
PART(I)
所有AJAX請求完成?

for (var i = 0; i < arr.length; i++){ 
     var id = arr[i].id; 
     makeXHRRequest(id); 
    } 

makeXHRRequest()功能是這樣的:

PART(II)

function makeXHRRequest(id){ 
var jsonArg = ["id", id]; 
var jsonString = JsonBuilder(jsonArg); 
var requestUrl = getUrl(); 

$.ajax({ 
     url: requestUrl, 
     type: "POST", 
     contentType: 'application/json', 
     data: jsonString, 
     datatype: "json", 
     processdata: false, 
     success: function (result, status) { 
     console.log(result); 
     // TODO check if result is valid 
     if(result == null || result == ""){ 
     //... 
     }else{ 
      for(var i = 0; i < parent.arr.length; i++){ 
       for(var j = 0; j < count; j++){ 
        // !!!!! make another ajax call !!!!!!!! 
        makeAnotherXHRRequest(id); 
       } 
       } 
      } 
     } 
     }, 
     error: function (xhr, ajaxOptions, thrownError) { 
      console.log("in get groupUsers fail"); 
     } 
}); 

}

注意這些是嵌套的AJAX調用 - >上面的part(I)中發出的每個ajax調用在part(II)中發出一堆子Ajax調用。所以我的問題是,如果程序想在所有數據準備好後執行一些任務,那麼程序如何知道part(I)中的所有請求以及part(II)中的所有請求是否完成?

+0

http://stackoverflow.com/questions/11755186/tracking-with-java-script-if-ajax-request-is-going-on-in-a-webpage-or-intercept – 2013-04-22 03:27:01

回答

2

jQuery的回報Deferred objectsAjax methods,又名承諾,您可以到,如果他們做或不該。就你而言,我們可以將它們收集到一個數組中。然後我們用$.when聽取承諾,如果他們是全部已解決。

var promises = []; 

function makeXHRRequest(id){ 
    ... 
    //we return the ajax promise 
    return $.ajax(.. 
    ... 
} 

for (var i = 0; i < arr.length; i++){ 
    ... 
    //we store the promise 
    promises.push(makeXHRRequest(id)); 
} 


$.when 
.apply(null,promises) //listen to all the promises 
.done(function(){ 

    /*code here executes when all ajax promises resolves*/ 

});