2015-02-09 2 views
-1

Недавно я заметил поведение моего кода ниже.Функции JavaScript с ajax не выполняются один за другим?

function abc(){ 
     a(); 
     b(); 
     c(); 
    } 
    function a(){ 
     // ajax call 
     $("#number").val("a"); 
     // ajax call finished 
    } 
    function b(){ 
     // ajax call 
     $("#number").val("b"); 
     // ajax call finished 
    } 
    function c(){ 
     alert($("#number").val()); 
     // ajax call 
     $("#number").val("c"); 
     // ajax call finished 
    } 

HTML код

<input id="number" value="" type="hidden"/> 

<button type="submit" id="mySubmit" onClick="abc()">Search</button> 

Я думал, когда я вызываю функцию abc() тогда первый a() будет выполнять, а затем b(), а затем c()

Но мне кажется, что alert в c() это выполняется до b() заканчивается, потому что он показывает a в качестве результата.

Но если код, как показано ниже он работает, как и ожидалось, (предупреждения показывает b)

function abc(){ 
     a(); 
     b(); 
     c(); 
    } 
    function a(){ 
     $("#number").val("a"); 
    } 
    function b(){ 
     $("#number").val("b"); 
    } 
    function c(){ 
     alert($("#number").val()); 
     $("#number").val("c"); 
    } 

Почему это происходит? Являются ли эти вызовы ajax в первом коде, что-то делать с этим?

Примечание: извините, я не смог воссоздать эту проблему в скрипке. кто-то с таким опытом и знает причину, может помочь мне в этом.

И я также разместил this SO question. Эти ответы противоречат этому поведению.

+5

ajax: «Выполнить ** асинхронный запрос HTTP (Ajax)». – Tomanow

+0

http://blog.slaks.net/2015-01-04/async-method-patterns/ – SLaks

+0

@Tomanow: пожалуйста, вы можете уточнить свой ответ. – prime

ответ

6

Это характер вызовов Ajax. Когда вы выполняете асинхронные вызовы, они считаются «выполненными» после инициализации вызова, а не при завершении вызова. Поэтому он будет продолжать двигаться, не дожидаясь.

Если вы хотите сделать звонки в таком порядке, вы можете сделать несколько вещей:

  1. Марка B() и с() функции обратного вызова в вызове а() - Это означает, что вы будете ждать пока не закончится() и в части .done() вашего вызова вы можете вызвать другие функции
  2. Если вы используете jQuery, вы можете указать, что вы хотите, чтобы вызов не был асинхронным (async: false) - Смотрите здесь для получения дополнительной информации: http://api.jquery.com/jquery.ajax/
1

Ваша функция вызовет() b() и c(), но вы не можете обрабатывать порядок ответов для каждого вызова ajax, поэтому по этой причине они могут оказаться несортированными.

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