2013-10-08 63 views
0

我的代碼看起來像這樣:JQuery的 - 執行第一個命令之前第二

jQuery.getJSON("url/to/some/script.php", function(data) { 
    var test = data.someValue; 
     console.log('This message should occur first'); 
}); 

console.log('this message should occur second'); 

// do things with data retrived above... 

發生了什麼事是,第一console.log被執行後的第二個。我想,因爲需要時間來完成Ajax請求,但我沒有意識到它會繼續向下移動腳本而不完成。因此,當我嘗試在緊接着的代碼中使用它們時,由AJAX請求產生的變量是'未定義的'。

什麼可能是處理這種情況的最佳方法?

回答

1

在所謂的異步編程只有一個有效的解決方案:把你的代碼應該阿賈克斯結束之後到函數運行,那就是:

jQuery.getJSON("url/to/some/script.php", function(data) { 
    var test = data.someValue; 
    console.log('This message should occur first'); 

    console.log('this message should occur second'); 
    // And all code that should be run after Ajax should go here 
}); 

在傳統語言(例如,PHP )下一行代碼在前一行之後執行。如果某行有很長時間的行爲(如數據庫或Ajax請求),那麼程序將停止執行,直到該行將獲得請求的結果。

在異步編程中,相反,程序不會停止。它記得這個回調函數應該在請求完成後調用,並且會立即繼續運行所有更多行。所以,程序不必停下來等待。但是這意味着所有需要請求結果的代碼都應該放在回調函數中。

+0

這非常好,謝謝! – djt

1

使用無極接口,允許jQuery的Ajax的方法,比如jQuery.getJSON(),以鏈的一個或多個回調

jQuery.getJSON("url/to/some/script.php", function(data) { 
var test = data.someValue; 
    console.log('This message should occur first'); 
}).done(function() { 
    console.log('this message should occur second'); 
}): 
0

你可以使用jQuery承諾http://api.jquery.com/promise/幫助異步JavaScript

$.getJSON("url/to/some/script.php").success(function(data) { 
    var test = data.someValue; 
     console.log('This message should occur first'); 
}).done(function() { 
console.log('this message should occur second'); 
// do things with data retrived above... 
}); 
相關問題