2012-08-25 2 views
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 и проверить его значение на каждой итерации и установите его значение на ошибки, но до сих пор не работает

+2

Ajax является асинхронной, поэтому разорвать цикл в обратном вызове не будет вам хорошо, поскольку цикл уже давно завершен. – adeneo

+0

что делать тогда? – rahul

+0

Используйте обещания и деиствительные объекты. Вы уверены, что есть обработчик 'failure'? – adeneo

ответ

0

Когда $.ajax дает результат, $.each закончил уже. Обратите внимание, что первый «a» в ajax означает асинхронность. Что вы можете сделать, это создать рекурсивную функцию (вы не использовали ничего конкретного из каждого элемента, но я предполагаю, что вы так я $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 
+0

спасибо, что он отлично работает – rahul

-1

Сломать $ .each(), вам нужно возвращать ложные

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

Выход:


Read more

Но если вы хотите работать с асинхронным вызовом $ .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); 
+0

уже пробовал, но не работал – rahul

+0

@rahul, что вы пытались? Remeber, вам нужно «возвращать false» в '.........()' Context, а не внутри '$ .ajax()' – Deele

+1

. Как вы ожидаете, что это будет работать с асинхронным методом? – adeneo

0

have'nt тестировал, но я предполагаю, что-то, как это будет делать это без рекурсии или синхронного поведения:

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; 
} 
Смежные вопросы