2013-02-15 83 views
1

我的腳本需要處理幾個Ajax請求。這裏是一個簡化的版本:如何處理幾個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

變化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

只是澄清,這樣做會使你的代碼使用'$ .when'正常工作:) – 2013-02-16 03:54:08

+0

感謝您的澄清;我一開始並沒有明白... – Yako 2013-02-16 09:40:57

2

這些要求()調用將立即返回反正,因爲他們是異步(因此在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()函數,因此您沒有硬編碼的「繼續」函數調用,但這超出了此範圍回答。

+0

謝謝你的接吻。事實上,我正在轉向解決方案,因爲我無法理解延期對象,並且您的解決方案在此視圖中非常有效。不過,我更喜歡使用穆薩的選擇;它更輕,更適合jQuery。 – Yako 2013-02-16 09:40:32