2015-02-09 123 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調用的響應順序,所以出於這個原因,它們可能看起來是未排序的。

相關問題