0

我正在像这样使用 $.each 的 jquery

$.each($('.FormContainer div.MainDiv'), function () {
$.ajax({
      type: "POST",
      url: pageUrl + '/SaveFormResponse',
      data: jsonText,
      contentType: "application/json; charset=utf-8",
      dataType: "json",
      success: function (response) {
      if (isNaN(response.d) == false) {
          //continue executing $.each further
      }
      else {
          alert(response.d);
          //stop executing $.each further in case of error 
      }
      },
      failure: function (response) {
           alert(response.d);
      }

    });

});

现在的问题是,如果出现错误,我希望 $.each 停止进一步执行,但它不会停止,直到它不会遍历所有 div

我还尝试维护一个变量并在每次迭代时检查它的值并将其值设置为错误但仍然无法正常工作

4

3 回答 3

0

$.ajax给你一个结果时,$.each已经完成了。请注意,ajax 中的第一个“a”代表异步。您可以做的是创建一个递归函数(您没有使用每个元素的任何特定内容,但我假设您这样做了$elem):

var $elems = $('.FormContainer div.MainDiv');

(function fetch(i) {
    if(i >= $elems.length) return;  // no elems left

    var $elem = $elems.eq(i);

    $.ajax({
      type: "POST",
      url: pageUrl + '/SaveFormResponse',
      data: jsonText,
      contentType: "application/json; charset=utf-8",
      dataType: "json",
      success: function (response) {
        if (!isNaN(response.d)) {
          fetch(i + 1);  // next one
        } else {
          alert(response.d);  // just don't call fetch again
        }
      },
      failure: function (response) {
         alert(response.d);
      }
    });
})(0);  // start with first elem
于 2012-08-25T11:38:08.013 回答
0

还没有测试过,但我猜这样的事情会在没有递归或同步行为的情况下完成:

var XHRarray = [];

$.each($('.FormContainer div.MainDiv'), function() {
    var XHR = $.ajax({
        type: "POST",
        url: pageUrl + '/SaveFormResponse',
        data: jsonText,
        contentType: "application/json; charset=utf-8",
        dataType: "json"
    }).done(function(response) {
        if (isInteger(response.d)) {
            //continue executing $.each further
        }else{
            stopAll(); //stop all pending ajax requests
        }
    }).fail(function() {
        stopAll(); //stop all pending ajax requests
    });
    XHRarray.push(XHR);
});

function stopAll() {
    $.each(XHRarray, function(i,e) {
        e.abort();
    }
}​

function isInteger(s){ //checks string for numbers only
    for (var i = 0; i < s.length; i++){   
        var c = s.charAt(i);
        if (((c < "0") || (c > "9"))) return false;
    }
    return true;
}
于 2012-08-25T11:49:17.637 回答
-1

要打破 $.each(),你需要返回 false

$(function() {
    var temp = [0, 1, 2, 3, 4, 5];
    $.each(temp, function(k, v) {
        $('body').append(v);
        if (v == 3) {
            return false;
        }
    });
});

输出:

0123

阅读更多

但是,如果你想使用这样的异步 $.ajax() 调用,你需要在回调函数中决定是继续下一个项目还是停止。

var currentItem = 0, itemSet = $('.FormContainer div.MainDiv');
function workOnItem(itemNum) {
      if (itemSet[itemNum] != undefined) {
      var item = itemSet[itemNum];
      $.ajax({
            type: "POST",
            url: pageUrl + '/SaveFormResponse',
            data: jsonText,
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function (response) {
            if (isNaN(response.d) == false) {
                  //continue executing $.each further
                  currentItem++;
                  workOnItem(currentItem);
            }
            else {
                alert(response.d);
                //stop executing $.each further in case of error 
            }
            },
            failure: function (response) {
                 alert(response.d);
            }
        });
      }
}
workOnItem(0);
于 2012-08-25T11:38:38.003 回答