2017-01-12 3 views
0

У меня есть объект с функцией обув, содержащих AJAX вызов, JQueryждать АЯКС закончить в функции

foo: function() { 
    ... 
    jQuery.ajax({ 
      contentType : "application/json", 
      type: "POST", 
      async: true, 
      ..., 
      success: function(data) { 
       globalVariable = 1;   
      }, 
      error: function(error) { 
      } 
    }); 
} 

Мой тестовый код:

var pass = true; 
    myObj.foo(); 

    if (globalVariable !== 1) { 
     pass = false; 
    } 

Я хочу заявление myObj.foo() закончить с АЯКС отделкой тоже. Если ajax не заканчивается, globalVariable не равен 1.

Я не могу установить async в false в ajax, потому что это производственный код.

+0

GlobalVariable должен быть установлен в '1' с этим функции, вам просто нужно подождать, пока ca завершено. Возможно, посмотрите на передачу функций обратного вызова на 'foo()', которые уведомили бы вас, когда был вызван 'success' /' error'. В качестве альтернативы вы можете посмотреть в jQuery обещания: https://api.jquery.com/promise/ – haxxxton

+0

Не делайте этого синхронно, @Vu Le Anh. Думаю, теперь рекомендуется использовать функцию 'foo' promisable. Затем вы можете выполнить проверку 'globalVariable' на' done' callback функции prom, в которой эта переменная будет передана как параметр в обратном вызове. –

+0

То, что вы просите, невозможно, если вы не можете установить 'async' в false. Javascript является однопоточным. Таким образом, код ajax добавляется в очередь выполнения после foo и запускается только после того, как функция foo завершает свою очередь. Если вы помещаете что-либо в функцию foo, чтобы ждать завершения вызова ajax, то он будет работать вечно, когда никогда не запускается вызов ajax. –

ответ

0

Ваша функция запущена. Просто он работает как можно скорее. Если вы хотите остановить другие процессы, а foo() запускает, установите async в false.

foo: function() { 
    ... 
    jQuery.ajax({ 
      contentType : "application/json", 
      type: "POST", 
      async: false, 
      ..., 
      success: function(data) { 
       globalVariable = 1;   
      }, 
      error: function(error) { 
      } 
    }); 
} 
+0

Я редактирую свой вопрос. Я не могу изменить 'async: false' как ваш комментарий –

0

Если это так, то вместо этого добавьте параметр функции в foo. Эта функция будет вызываться после завершения вызова ajax.

var bar = function(){ 
    pass=true; 
} 

Тогда Foo станет

foo: function(func) { 
    ... 
    jQuery.ajax({ 
      contentType : "application/json", 
      type: "POST", 
      async: false, 
      ..., 
      success: function(data) { 
       globalVariable = 1; 
       func();   
      }, 
      error: function(error) { 
      } 
    }); 
} 

вызова Foo

var pass = false; 
myObj.foo(bar); 
0

Фрагмент кода следует promise подход:

var pass = true; 
    var myObj = { 
     foo: function() { 
      return $.Deferred(function (deferred) { 
       jQuery.ajax({ 
        type: "POST", 
        url: 'https://httpbin.org/post' 
       }).done(function() { 
        deferred.resolve(1); 
       }).fail(function() { 
        deferred.reject(); 
       }); 
      }).promise(); 
     } 
    }; 
    myObj.foo().done(function (globalVariable) { 
     if (globalVariable !== 1) { 
      pass = false; 
     } 
    }); 
Смежные вопросы