2015-08-18 3 views
0

Мне нужно получить доступ к переменной «cont» после запуска каждого цикла. Мне нужно запустить электронное письмо, если cont = true, который устанавливается после вызова ajax в каждом цикле. Я читал, что каждый цикл является синхронным, но когда я завершаю log var cont после каждого цикла, я получаю false, даже если он установлен как истинный.переменная доступа jQuery за пределами каждого цикла

$(".check").click(function (event) { 
    var cont = false; 
    event.preventDefault(); 
    $("form.form").each(function (index) { 
     var $this = $(this); 
     var name = $this.find('input.name').val(); 
     var company = $this.find('input.comp_name').val(); 
     var jtitle = $this.find('input.job_title').val(); 
     var link = $this.find('input.link').val(); 
     var email = $('input.email').val(); 

     if ((name === "") || (company === "") || (jtitle === "")) { 
      $this.addClass("NotFilled"); 
     } else { 
      var url = $this.attr('action'); 
      // fetch the data for the form 
      var data = $this.serializeArray(); 
      $.ajax({ 
       url: url, 
       data: data, 
       type: "post", 
       success: function (result) { 
        if (result === "success") { 
         cont = true; 
         $this.removeClass("NotFilled").addClass("filled"); 
         //console.log(cont) I Get True here 
        } else { 
         cont = false; 
         $this.removeClass("filled").addClass("NotFilled"); 
        } 
        return cont; 
       } 

      }); 
     } 
    }); 
    //console.log(cont) I Get false here 
    if (cont === "true") { 
     $.post("<?php bloginfo('template_url'); ?>/x/x.php", { 
      emailTo: email, 
      emailFrom: '[email protected]', 
      subject: 'New x x x', 
      message: 'We x x x' 
     }, 

       function (data) {}); 
    } 
}); 
+2

Вы должны поместить этот код в обратный вызов вызова ajax. потому что это асинхронно по природе – mohamedrias

+0

Возможный дубликат: http://stackoverflow.com/questions/6685249/jquery-performing-synchronous-ajax-requests – Pete

ответ

1

Код внутри метода each является Ajax, и это асинхронная в природе.

Так что утверждение

if(cont === "true"){ 

будет выполняться еще до Аякса вызовы успешно/сбой.

Таким образом, вы должны либо преобразовать ajax для синхронизации, установив флаг async, либо поместите условие if внутри обратного вызова.

Пример синхронного вызова Ajax:

$.ajax({ 
    url: url, 
    data: data, 
    async: false 

    type: "post", 
    success: function (result) { 
     if (result === "success") { 
      cont = true; 
      $this.removeClass("NotFilled").addClass("filled"); 
      //console.log(cont) I Get True here 
     } else { 
      cont = false; 
      $this.removeClass("filled").addClass("NotFilled"); 
     } 
     return cont; 
    } 

}); 
+0

Форсирование async: false - это плохая практика, а в некоторых случаях лишена –

+0

@jimmyjansen Ya , это не рекомендуется. Но я просто предлагаю, чтобы текущий код работал. Гораздо лучший подход состоял бы в том, чтобы использовать обещание и обрабатывать все запросы ajax, чтобы вернуть обещание, и когда обещания будут решены, активируйте условие if – mohamedrias

0

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

Вы можете установить $.ajaxSetup({async: false});, чтобы ваш код ожидал выполнения вызова ajax и установил $.ajaxSetup({async: true}); после выполнения.

0

как @mohamedrias сказал: javascript является асинхронным с самого своего ядра. Это означает, что если оператор выполняется до вызова Ajax возвратил успех или неудачу

рассмотрим следующий код:

console.log('First'); 
jQuery.get('page.html', function(data) { 
    console.log("Second"); 
}); 
console.log('Third'); 

В этом фрагменте ваша консоль будет регистрировать: Во-первых, третий, второй.

Теперь, если мы должны были сделать это, чтобы запустить асинхра:

console.log('First'); 
getPage("page.html, function(){ 
    console.log('Third');   
} 


var getPage(url, callback) { 
    jQuery.get(url, function(data) { 
    console.log("Second "); 
    } 
    callback(); 
} 

Теперь он записывает: Первый, Второй, Третий

Есть много ресурсов, об этом в интернете, то один я понял, что это: this one

Смежные вопросы