2013-11-14 47 views
1

我試圖只在setTimeout回調中設置它之後才返回一個變量。我想不出任何其他方式來做到這一點,但這是我的嘗試(我知道代碼看起來很愚蠢,但它是爲了解決科爾多瓦的一個bug)。由於我理解之外的原因,它會導致無限循環。setTimeout之後的返回變量

function isConnected() { 
    var done = false; 
    setTimeout(function() { 
     done = true; 
    }, 500); 

    while (!done) {} 
    return navigator.connection.type!== Connection.NONE; 
} 

任何人都可以向我解釋爲什麼會發生這種情況,或提供替代?

更新(溶液):

function isConnected(callback) { 
    setTimeout(function() {  
     callback(navigator.connection.type !== Connection.NONE); 
    }, 500); 
} 


isConnected(function(connected) { 
    if (!connected) 
     alert('Not Connected'); 
}); 

回答

5

你根本無法解決你的問題。因爲javascript是單線程的,所以setTimeout回調只能在您的JS線程執行完畢後才能運行,並且無限循環時,它永遠不會運行,您的代碼將掛起。最終,瀏覽器會抱怨一段長時間運行的JS,並提出關閉它。

相反,您需要在setTimeout()上使用回調函數,並從該回調中繼續執行代碼。您不能使用連續代碼超時。您必須使用異步編碼樣式。

,你在回調中傳遞並調用執行回調,並將它連接的布爾你可以做這樣的事情:

function GetConnectedState(callback) { 

    setTimeout(function() {  
     callback(navigator.connection.type !== Connection.NONE); 
    }, 500); 

} 

現有的代碼似乎並沒有提供比看任何其他在1/2秒的連接狀態下。通過javascript中的任何實際的異步操作(例如ajax調用或websocket連接),還應該有一個成功或完成的回調函數,它會告訴您何時/如果操作實際完成,並且您還可以基於(大部分時間早於1/2秒)。所以,這看起來並不是一個完整的解決方案,但它只是您向我們展示您正在使用的。

例如,下面是一個答案,你可以看到一個答案,當圖像加載成功時,出現錯誤或超時沒有響應:Javascript Image Url VerifyHow to implement a "function timeout" in Javascript - not just the 'setTimeout'。類似的概念可以用於在其他類型的異步調用上實現您自己的超時。

4

JavaScript是單線程。直到腳本返回到主事件循環,超時功能才能運行。但只要你在while循環中,它永遠不會返回,所以超時功能永遠不會運行,所以done永遠不會設置爲true

在返回之前,Javascript無法等待異步事件。