2014-03-26 161 views
0

HIII大家, 我已經創建使用HTML標籤的基於應用程序,我已經使用的setInterval用於從所述服務器同步的應用數據,規則的時間間隔之後。但問題是,在同步數據時,如果我在標籤之間切換,執行代碼將停止,因此無法完成同步。執行Javascript代碼在後臺線程

我想在不同的線程中調用sync(),但無法獲得任何幫助。關於如何實現這一點的任何想法,以便在切換標籤時,我的JS代碼繼續執行。 我的JS代碼粗糙的結構是

setInterval(
sync(); 
,3000); 

function sync() 
{ 
// Code for sync data 
} 
+2

你是什麼意思*不同的線程*? JavaScript是單線程的(雖然[網絡工作者]有一個HTML5規範(https://developer.mozilla.org/en-US/docs/Web/Guide/Performance/Using_web_workers)) –

回答

4

一個與你的榜樣的問題是,你只執行sync一個時間(因爲你setInterval調用中添加()它)。本質上你執行sync一次並將結果傳入。

另一個問題是終止該行的;

所以去掉括號和分號可以解決您的問題:

setInterval(sync, 3000); 

Athough我建議你使用超時,而不是一個區間 - 的情況下,請求花費的時間超過三秒。

function sync() { 
    // Code for sync data 

    setTimeout(sync, 3000); 
} 

sync(); 

總體而言,您的JavaScript使用事件循環在一個線程上執行,以按順序執行所有事件。無論如何,線程並不能解決你的問題,因爲它是一個輕微的語法問題。

Web workers將允許瀏覽器中的其他線程和NodeJS也有一個線程機制 - 但它們應該謹慎使用。

+0

Cordova應用程序不允許我使用工人。在創建相同的構造函數時出現「Worker not found」錯誤。 var worker = new Worker(「filename.js」); – Bhavna

+0

@Bhavna - 不要使用工人來解決你的問題,只需糾正我提到的語法錯誤。 – Fenton

+0

Thanx for ur help ..但更正語法沒有工作..!實際上,如果我留在任何一個頁面上,同步正在運行。只要我在頁面之間切換,同步就會停止。所以我希望它在後臺線程..但不能得到它! – Bhavna

0

您可能需要使用Web Workers

工作者線程可以在不與用戶界面干擾執行任務。另外,他們可以使用XMLHttpRequest執行I/O(儘管responseXML和channel屬性始終爲空)。

您可以通過message與網絡工作者溝通。作爲一個想法,您可以在頁面啓動時產生一名工作人員,然後向其發送帶有要上傳數據的消息。它會默默地在後臺爲你做。


另一個想法是使用Web Sockets。您的瀏覽器可以通過listen接收來自服務器的消息。服務器可以broadcast更新到您的瀏覽器。

+0

雖然[所有瀏覽器都不支持](http://caniuse.com/#search=web%20workers),您必須小心使用Web Workers。我們在試圖運行iPhone 3GS或更低版本以及Android設備4.4以下版本的Cordova應用程序中遇到了此問題。 –

+0

科爾多瓦的應用程序不允許我使用工人。在創建相同的構造函數時出現「Worker not found」錯誤。 var worker = new Worker(「filename.js」); – Bhavna