2012-10-17 107 views
2
function method1() { 
    method2(); 
    var x = 1; 
} 

function method2() { 
    $.ajax({ 
     type: "GET", 
     async: true, 
     url: "/MyController/MyMethod", 
     success: function (data) { 
      var y = 6; 
     } 
    }); 
} 

哪個先發生 - y的初始化還是x的初始化? 如果ajax調用是sync而不是async,那麼這兩行代碼的順序是?代碼執行順序

method1在加載頁面時被調用。

+0

嗯,這取決於你調用哪個方法,自變量只有功能 – imulsion

+0

內部存在如果呼叫同步,這取決於GET請求的成功與否。 – Thilo

+0

@Thilo讓我們假設它總是成功。 –

回答

1

x將首先被初始化(除非HTTP響應在它能夠執行下一行之前返回,這是極不可能的)。 $ .ajax是異步的,響應會返回需要一些時間。

如果你想保證y爲首先初始化,你應該這樣做,而不是:

function method1() { 
    method2(function() 
    { 
     var x = 1; 
    }); 
} 

function method2(callback) { 
    $.ajax({ 
     type: "GET", 
     async: true, 
     url: "/MyController/MyMethod", 
     success: function (data) { 
      var y = 6; 
      callback(); 
     } 
    }); 
} 
+0

「除非HTTP響應能夠執行下一行之前返回,這是極不可能的」我不認爲這會發生,無論響應速度有多快。 Javascript是單線程的,事件/回調將在當前代碼路徑完成後處理(不會在行之間中斷)。 – Thilo

2

如果它是同步的,並且GET成功,那麼Y首先被初始化。如果它是異步的,它可能是,但我會把我的錢放在X上,因爲我懷疑它會在Web方法返回之前繼續。這就是說,不能保證X會先被解僱。

+0

$ .ajax是異步 – PhonicUK

+0

是的,是的,但是在問題中他想要兩種情況。 – VoronoiPotato

+1

「如果它是異步的,它可以是」,否。由於Javascript是單線程的,當前的代碼路徑將在執行任何回調之前完成。 X總是會先被解僱。 – Thilo