2012-09-28 37 views
0

我想繼續檢查列表,直到找到可用的項目。對於列表中的每個項目,它都會發出發布請求以檢查項目是否可用。我想保持它的異步。另外請注意,我使用ajaxq函數而不是ajax函數,那是因爲我正在使用這個排隊腳本http://code.google.com/p/jquery-ajaxq/。所以在它開始分類之前它不會結束。我相信那不是問題。Javascript:從循環中斷

我需要一種方法來打破循環一旦有一個項目是可用的,所以我不能只使用回調函數,因爲它將無法擺脫功能內的循環。 所以我認爲增加一個變量,如果它完成並使用do-while循環可以工作,但它會凍結我的瀏覽器,就像它是一個永無止境的循環。

任何建議如何解決這個問題或做一個更好的方法會很好。

do { 

    var d = 0; 
    for(var i in list) { 

     var item = list[i]; 

     $.ajaxq('queue', { 
      type: 'POST', 
      url: baseURL + '/ChangeItem/Check', 
      data: { 
       'newItem': item, 
       'purchaseItem': false 
      }, 
      error: function(jqXHR, textStatus) { 
       alert(textStatus); 
      }, 
      dataType: 'text', 
      success: function(data) { 
       if(thisObject.isNotTaken(data)) { 
        d++; 
        thisObject.claimItem(); 
       } 
      } 
     }); 
    } 

} while(d == 0); 
+2

這不是一個很好的編程方法。 –

+0

然後有什麼建議? – user1684699

回答

1

可以使用遞歸函數:

function ChangeItem(list, index) { 
     var item = list[index]; 

     $.ajaxq('queue', { 
      type: 'POST', 
      url: baseURL + '/ChangeItem/Check', 
      data: { 'newItem': item, 'purchaseItem': false }, 
      error: function(jqXHR, textStatus) { alert(textStatus); }, 
      dataType: 'text', 
      success: function(data) { 
       if(thisObject.isNotTaken(data)) { thisObject.claimItem(); doWhateverYouWantNext(); } 
       else ChangeItem(list, index+1); 
      } 

     }); 
} 
+0

感謝您向我展示正確的方法。 – user1684699

1

,該請求將只排隊保證,他們將在第二階段開始前seuqentially執行,而第一個請求將已完成的事實。這並不意味着你的代碼排隊的第二個請求將等到第一個請求完成。所以ajaxq不會幫你在這裏。你必須迴歸到一個遞歸函數,它從AJAX回調中調用自身。如上所述,你會注意到這會引發一系列的請求到你的服務器,並且可能是一系列的數據庫查詢。您可能會發現將整個項目列表發送到服務器,並返回第一個匹配項將是一個更簡潔的方法。

0

請試試這個:

var d = 0; 
for(var i in list) { 

    if(d == 0) 
    { 
     var item = list[i]; 

     $.ajaxq('queue', { 
      type: 'POST', 
      url: baseURL + '/ChangeItem/Check', 
      data: { 
       'newItem': item, 
       'purchaseItem': false 
      }, 
      error: function(jqXHR, textStatus) { 
       alert(textStatus); 
      }, 
      dataType: 'text', 
      success: function(data) { 
       if(thisObject.isNotTaken(data)) { 
        d++; 
        thisObject.claimItem(); 
       } 
      } 
     }); 

    } 
}