Javascript:从循环中断

时间:2012-09-28 06:48:28

标签: javascript

我想继续检查列表,直到找到可用的项目。对于列表中的每个项目,它将发出一个帖子请求以检查该项目是否可用。我想让它保持异步。另请注意,我使用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);

3 个答案:

答案 0 :(得分: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);  
            }

        });
}

答案 1 :(得分:1)

请求将排队的事实仅保证它们将按顺序执行,并且第一个请求将在第二个请求开始之前完成。这并不意味着您排队第二个请求的代码将等到第一个请求完成。因此,ajaxq无论如何都无法帮助您。你必须回退到一个递归函数,它从AJAX回调中调用它自己。

话虽如此,您会注意到这会导致对您的服务器发出一系列请求,并且可能是一系列数据库查找。您可能会发现将整个项目列表发送到服务器是一种更简洁的方法,并从那里返回第一个匹配项。

答案 2 :(得分: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();
                }
            }
        });

    }
}