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

テストはしていませんが、このようなものは再帰や同期動作なしで実行できると思います。

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 に答える
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 に答える
-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 に答える