2015-02-09 67 views
-1

我最近注意到我的代码的下面的行为。带有ajax的JavaScript函数不会一个接一个执行?

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()

但在我看来,alertc()是之前执行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 2015-02-09 20:03:19

+0

http://blog.slaks.net/2015-01-04/async-method-patterns/ – SLaks 2015-02-09 20:03:47

+0

@Tomanow:请你能详细说明你的答案。 – prime 2015-02-09 20:04:37

回答

6

这是Ajax调用的本质。在进行异步调用时,一旦调用被初始化,它们就被视为“完成”,而不是在调用完成时。因此它会一直继续前进,不用等待。

如果你想在这个顺序的电话,你可以做两件事情:

  1. 制作B()和C()回调在调用一个() - 这意味着你等待直到a()完成并且在调用的.done()部分中,可以调用其他函数
  2. 如果您使用的是jQuery,则可以指定您希望调用不是异步的(async:false ) - 请参阅这里获取更多信息:http://api.jquery.com/jquery.ajax/
1

您的函数将调用()b()和c (),但是你不能处理每个Ajax调用的响应顺序,所以出于这个原因,它们可能看起来是未排序的。