繁体   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