Javascript:打破ajax请求的成功函数内部的循环

时间:2012-09-21 03:48:59

标签: jquery ajax httprequest

我需要发送$ .ajax请求并检查响应HTML以查看它是否包含某些文本。如果它确实存在,我想执行一个单独的函数并打破当前循环,因此它不会继续请求其他项。

我知道我无法打破成功函数中的循环,因为它在自己的范围内。任何解决方案都会很棒。

    for(var i in list) {

      var item = list[i];

      $.ajax({
            type: 'POST',
            url: baseURL + '/ChangeItems/CheckAvailability',
            data: { 'newitem': item, 'purchaseItem': false },
            error: function(jqXHR, textStatus) { alert(textStatus); },
            dataType: 'text',
            success: function(data) { if(checkItem(data)) { buyItem(); break; } }
        });
   }

4 个答案:

答案 0 :(得分:1)

我没有测试过这段代码,但我认为这是一个想法,它应该可行。

var list = [...], i = 0;
function myAjaxRequest(i)
{ 
    var item = list[i];

    $.ajax({
        ...
        success: function(data)
        {
            if( checkItem(data) )
            {
                buyItem();
            }
            else if( typeof list[i+1] != "undefined" )
            {
                 myAjaxRequest(i+1);
            }
        }
        //, error: function(){ if( typeof list[i+1] != "undefined" ) myAjaxRequest(); }
    });
}

myAjaxRequest(i);

答案 1 :(得分:0)

你可以让它同步并在$ .ajax之外进行处理:

for(var i in list) {
  var item = list[i];
  var result;

  $.ajax({
        type: 'POST',
        url: baseURL + '/ChangeItems/CheckAvailability',
        data: { 'newitem': item, 'purchaseItem': false },
        error: function(jqXHR, textStatus) { alert(textStatus); },
        dataType: 'text',
        async: false,
        success: function(data) { result = data; }
   });

   if(checkItem(result)) { buyItem(); break; }
}

答案 2 :(得分:0)

测试一下,我遇到了这个问题,我现在就解决了:

$break=0;
 for(var i in list) {
     if ($break) { break; }
      var item = list[i];
      $.ajax({
            type: 'POST',
            url: baseURL + '/ChangeItems/CheckAvailability',
            data: { 'newitem': item, 'purchaseItem': false },
            error: function(jqXHR, textStatus) { alert(textStatus); },
            dataType: 'text',
            success: function(data) { if(checkItem(data)) { buyItem(); $break = 1; } }
        });
   }

无法打破ajax响应中的循环。

答案 3 :(得分:-1)

您可以将异步请求中的每个xhr对象存储在一个数组中,并在其中一个成功完成后取消所有以下请求。

var xhrList = [];
var xhr = $.ajax({
    type: 'POST',
    url: baseURL + '/ChangeItems/CheckAvailability',
    data: { 'newitem': item, 'purchaseItem': false },
    error: function(jqXHR, textStatus) { alert(textStatus); },
    dataType: 'text',
    async: false,
    success: function(data) { 
        for(var i = 0; i < xhrList.length; i++){
            xhrList[i].abort();
        } 
    }
});
xhrList.push(xhr);