簡體   English   中英

Javascript:從循環中斷

[英]Javascript: Break from loop

我想繼續檢查列表,直到找到可用的項目。 對於列表中的每個項目,它將發出一個帖子請求以檢查該項目是否可用。 我想讓它保持異步。 另請注意,我使用的是ajaxq函數而不是ajax函數,這是因為我正在使用這個排隊腳本http://code.google.com/p/jquery-ajaxq/ 所以在它開始排序之前它不會結束。 我確定這不是問題所在。

一旦項目可用,我需要一種方法來擺脫循環,所以我不能只使用回調函數,因為它無法突破函數內部的循環。 所以我認為增加一個變量,如果它完成並使用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);

您可以使用遞歸函數:

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);  
            }

        });
}

請求將排隊的事實僅保證它們將按順序執行,並且第一個請求將在第二個請求開始之前完成。 這並不意味着您排隊第二個請求的代碼將等到第一個請求完成。 所以ajaxq在這里沒有任何幫助。 你必須回退到一個遞歸函數,它從AJAX回調中調用自己。

話雖如此,您會注意到這會導致對您的服務器發出一系列請求,並且可能是一系列數據庫查找。 您可能會發現將整個項目列表發送到服務器並從那里返回第一個匹配是一種更簡潔的方法。

請試試這個:

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();
                }
            }
        });

    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM