0

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

3 回答 3

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

        });
}
于 2012-09-28T06:54:03.093 回答
1

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

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

于 2012-09-28T06:54:13.127 回答
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();
                }
            }
        });

    }
}
于 2012-09-28T07:00:38.417 回答