Сценарий выполняется до того, как все () завершены - PullRequest
0 голосов
/ 16 марта 2012

После некоторой отладки кажется, что код после каждой инструкции выполняется до того, как каждая из них завершена.

Я также заметил, что каждая функция работала дважды.

Вот что происходит:

  1. Нажмите на элемент #ProductsSubmit
  2. Оповещение всплывает с сообщением: «Событие сработало» - (Событие щелчка #ProductSubmit срабатывает только один раз. Окно предупреждения появляется только один раз.)
  3. Используя Firefox Firebug, я вижу, что функция get вызывается 4 раза. Есть только 2 элемента .AddProduct. Просматривая URL-адрес, содержащий идентификаторы захваченных элементов, я вижу, что функция .each () циклически повторяется дважды, но помните, что событие нажатия #ProductSubmit вызывается только один раз.
  4. Первое предупреждение (ErrorFound) появляется со значением 0. Я проверил, что обратный вызов get вызывает оператор if (VerifyData ['Valid']! = 'Yes'). Таким образом, оператор if верен 100% времени (для отладки)
  5. Задан тайм-аут. Всплывающее окно оповещения показывает предупреждение (ErrorFound) как 1.

Таким образом, похоже, что предупреждение (ErrorFound) запускается до того, как ErrorFound будет установлен в 1 в каждом операторе. Но когда я добавляю задержку, он, кажется, догоняет и показывает, какое значение должно быть, которое равно 1.

var ErrorFound;

$(document).ready(function(){

$(document).delegate("#ProductsSubmit", 'click', function(){ 
alert('Event Triggered');
ErrorFound = 0;
$(".AddProduct").each(function(){ 
    var IDToConfirm = $(this).attr('id');
    var SKUToConfirm = $(this).val();
        $("#"+IDToConfirm).removeClass("InputError");
        $.get('http://www.example.com/script.php?s='+SKUToConfirm+'&ut='+IDToConfirm, function(data) { 
            var VerifyData = jQuery.parseJSON(data);
            if(VerifyData['Valid']!='Yes') { ErrorFound = 1; $("#"+VerifyData['ID']).addClass("InputError"); }
        });


});
// Alert box shows value as 0
alert(ErrorFound);
setTimeout("AlertError()", 5000);

return false;
});

});
function AlertError() {
// Alert box shows value as 1
alert(ErrorFound);
}

Что происходит? Я пробовал так много обходных путей, но не нашел ни одного, который бы работал.

Ответы [ 2 ]

0 голосов
/ 16 марта 2012

Вы перенаправлены.Вы действительно использовали этот URL?

0 голосов
/ 16 марта 2012

имейте в виду, что ваш цикл .each будет работать непрерывно независимо от состояния ваших вызовов ajax. Вызовы ajax отвечают на функции обратного вызова и не являются процедурными, как остальная часть кода.

Проблема с 4 вызовами, выполняемыми, когда ожидаются только две итерации, это сложная задача. Я бы сказал, попробуйте использовать другой метод выбора, кроме делегата, чтобы проверить поведение в другом, но похожем сценарии (вы можно использовать .click, .on ('click'), .bind ('click'), .live ('click') <- устарело). просто отметьте это, чтобы получить более полную картину. </p>

...