2012-04-18 51 views
0

此代碼掛起。強制使用閉包同步JavaScript

我有理由相信這是因爲匿名函數中的響應是一個新的變量沒有與外部範圍連接。我該如何解決這個問題?

function foo() { //... 

    var url = "http://urliciously-urlish-url" 
    response = null; 
    $.get(url, function (data) {response = data; 
           }); 

    while(response === null) 
    { 
     1; 
    } 
    console.log(response); 

    //... 
} 

我知道,這樣的設計會(像往常一樣爲輪詢系統)掛在頁面直到響應變得非空。在這種情況下沒關係。

+0

你確認你的$ .get正在返回東西嗎? – 2012-04-18 18:15:10

+0

@Cris:是的,網址是正確的。 – 2012-04-18 18:18:35

+0

下面的答案是正確的 - 一般來說,異步寫作是你應該做的 - 但是一個爭論的焦點:僅僅因爲url是正確的,並不意味着使用chrome inspector,fiddler或者確認你正在獲取數據的其他內容。 – 2012-04-18 18:22:13

回答

3

$.get是異步的。如果你真的這是同步的,你必須使用$.ajax功能:

$.ajax({ 
    url: url, 
    async: false, 
    success: function(data) { 
     response = data; 
    } 
}); 

話雖這麼說,我同意潮 - 你應該習慣了編寫異步代碼。

1

當您的代碼正在運行時,事件處理程序不會。

譯文:此代碼不起作用。

如果你想使用JS,你幾乎肯定會習慣於編寫異步代碼。

0

不,問題是回調永遠不會執行,因爲JS線程仍在運行。它將等待當前上下文結束,然後繼續執行「下一個打勾」(此處爲回調)。在滴答之間,它也可以更新DOM並處理其他事情。

而不是使用吊環,使用synchronous ajax request(是的,這是可能的)。在jQuery中:{async:false}。然而,它會「只」掛起,直到請求結束 - 這可能永遠不會發生。而無響應的GUI是最糟糕的事情發生,所以不要使用它。