2012-10-23 36 views
2

我必須對特定數組執行ajax請求,並在繼續循環中的下一個迭代之前等待服務器響應。在下一次迭代之前等待ajax成功

我目前有我的迭代同時執行。我只有在確保成功後才能繼續下去?

感謝您的任何建議。

myArray.each(function(val, index) { 
    new Ajax.Request(myUrl + val, { 
     onSuccess: function() { 
       responseFromServer(); 
     } 
    }); 
    void(0); 
}); 
+0

的所有項目? [這裏是一個例子](http://msdn.microsoft.com/en-us/magazine/gg723713.aspx)基本上做你的問題。 –

+0

@JimSchubert這並沒有真正顯示如何對它們排隊,只是在完成後如何得到通知。 –

+0

@JuanMendes我想我誤解了Dee只是希望等待所有響應的成功,而不是僅在前一個請求成功完成後才以串行方式執行每個ajax請求。 –

回答

2

可以嘗試像這樣

function getItem(url, array, index) 
{ 
    new Ajax.Request(url + array[index]) 
    { 
     onSuccess : function() 
     { 
     responseFromServer(); //assuming this handles the server response 
     if (index < array.length) 
      getItem(url, array, ++index); 
     } 
    } 
} 

然後只需用

getItem(myUrl, myrray, 0); 

基本上調用它,你要回調,開始下一個ajaxrequest,關於下一個項目數組中

+0

感謝您的回答,您需要增加循環之前的唯一值:++ index – Dee

+0

您是對的,良好的捕獲。我將編輯回答文件 – speakingcode

0

嘗試類似這樣的事情。基本上,不是迭代所有元素,而是從數組中取出第一項,併發出AJAX請求。然後,當您的請求成功完成時,您將調用下一個項目。

請注意,在這個例子中,原始數組是變異的,在你的情況下可能會也可能不會。

function invokeAll(myArray) 
{ 
    var val = myArray.shift(); //get the next item to be processed 
    if (!val) 
     return; 
    new Ajax.Request(myUrl + val, { 
     onSuccess: function() { 
       responseFromServer(); 
       invokeAll(myArray); //got a successful response, start the next one 
     } 
    }); 
} 
3

只有在AJAX請求完成後,才能進入下一次迭代。我將使用jQuery來展示一個例子;

function sendRequests(requests) { 
    var value = requests.shift(); 
    $.ajax(myUrl + value).done(function(data){ 
     if (requests.length > 0) { 
      sendRequests(requests); 
     } 
    });  
} 

sendRequests([1,2,3,4]); 
+0

或者,只需:requests.length && sendRequests(requests); – nekman

+0

@nekman當然你可以使用它,但它並不比我所擁有的更清晰,我的代碼更適合你的建議。在我看來,'var a = b && b.c'是可以接受的。他們使用它的方式實際上被我們的樣式指導禁止,因爲(爲了代碼清晰),您不應該在布爾表達式中出現副作用 –

+0

我同意你的看法,它更清晰。我只是傾向於喜歡JS中的單線,因爲「​​因爲你可以」:)。無論如何,真正的問題/問題很好的解決方案! – nekman

0

你可以寫一個類這份工作,其processNext()函數將您是否使用了框架,它提供了一個承諾API處理數組

var arrayProcessor = { 
     values: [], 
     process: function(arr) { 
      arrayProcessor.values = arr; 
      arrayProcessor.processNext(); 
     }, 
     processNext: function(){ 
      if (arrayProcessor.values.length > 0) { 
       new Ajax.Request(myUrl + arrayProcessor.values.shift(), { 
        onSuccess: function() { 
         responseFromServer(); 
         arrayProcessor.processNext(); 
        } 
       }); 
      } 
     }, 

    } 
+0

你擁有的不是一個類,它只是一個靜態對象。 –

+0

的確如此,因爲我知道JavaScript中的所有東西都是對象 –

+0

的確如此,但是您可以使用'prototype'對象實現類的行爲,這就是JS中通常所說的類。如果你不能創建你的'object'的多個副本,那不是一個類。 –

相關問題