1

我需要发送一个 $.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

4 回答 4

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);
于 2012-09-21T03:57:52.307 回答
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; }
}
于 2012-09-21T03:56:05.507 回答
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 响应中的循环。

于 2017-06-13T03:53:29.983 回答
-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);
于 2012-09-21T04:01:56.277 回答