2011-03-23 151 views
7

我有一個問題快速製作ajax 功能。這裏的僞/原型代碼:jQuery Ajax:在繼續之前如何等待* async *請求成功完成?

function blah1(arg1){//arg1 is an array, roughly 10 elements 

var arr[]; 

$.each(arg1, function(i){ 
//blah code 

    $.ajax({ 
     //blah options 
     async: true, 
     success: function(data){ 
      arr[i] = data.someInt; 
     }//end success 
    });//end ajax 
}//end each 

return arr; 
}//end function 

基本上,我發送一個ajax,並需要返回的數據進一步處理。

如果我將async設置爲true,則該函數立即返回空'arr'數組,因此整個腳本失敗。 但是,如果我將async設置爲false,那麼它可以工作,但需要很長時間。

我已經看到這個$.ajaxQueue();的東西,但坦率地說,我根本不理解它,我不知道它是否會起作用。

所以問題是,首先,有什麼辦法可以在同一時間異步發送所有的ajax請求,讓所有的ajax完成後,等待並返回arr []?如果沒有,ajaxQueue會在我的情況下工作嗎? (粗略的例子請?)

+0

難道你不能在單個AJAX請求中發送它的所有內容,並解析所有10個答案的結果嗎? – Peeter 2011-03-23 07:20:44

+0

這是可能的,但這意味着我將不得不在服務器端進行編輯,這對我來說是一團糟。我寧願在jQuery上做。 – JQonfused 2011-03-23 07:25:31

+0

1個請求比10個請求更好。您將最終達到瀏覽器請求限制。 – Peeter 2011-03-23 09:33:12

回答

4

你可以使Ajax調用同步,你似乎知道,個人我會重新考慮我的代碼,因此ajax調用的成功方法,然後觸發另一個函數的呼叫。

$.ajax({ 
     //blah options 
     async: true, 
     success: function(data){ 
      arr[i] = data.someInt; 
      myCall(arr[i]); 
     }//end success 
    });//end ajax 
5

使用jQuery 1.5推遲的我會選擇這樣的:

function blah1(arr, callback){ 
    $.when($.map(arr, function(val, i){ 
     $.ajax({ 
      //blah options 
      async: true 
     }); 
    }).toArray()).then(function(resultsArr) { 
     callback(resultsArr); 
    }); 
} 

的問題是你想在你的函數異步Ajax調用完成前返回數組。這不是真的可能,所以你需要通過回調來處理。

你在這裏做的是將你的對象數組映射到jqXHR對象(它們是延遲對象)。然後將該延遲對象數組傳遞給$.when

$.when需要一個數組,然後允許您在整個數組從ajax調用完成加載後運行.then函數。然後您將resultsArr作爲參數傳入您的.then函數。

如果您在ajax成功調用中操作返回值,則無法在同一函數中使用$.ajaxreturn

相關問題