2014-03-26 121 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