如果我的主页上有var,并且有一个工作线程试图设置这个var,那么页面是否可以访问它?假设一切都是同步的?
var routeWorker = new Worker('getroute.js');
var checkPatrolRouteFoundTimer;
var rw_resultRoute;
var routeFound = false;
routeWorker.onmessage = function(e) {
rw_resultRoute = e.data.route;
routeFound = true;
}
function checkPatrolReady() {
if(!routeFound)
checkPatrolRouteFoundTimer = setTimeout("checkPatrolReady()", 1000);
}
function ForcePatrol(index) {
routeWorker.postMessage(index);
checkPatrolReady();
...
//do work on route
...
}
在这种情况下,我所说的var是rw_resultRoute,我可以看到它在调试时设置正确。但唯一的问题是它是在工作线程中设置的,而不是在页面线程中设置的。
我按照我期望的方式流经ForcePatrol()方法,看起来像是设置了rw_resultRoute,因为在工作完成后routeFound的计算结果为true。
从技术上讲,它没有意义,因为routeFound可以由worker设置并由页面线程读取,但是rw_resultRoute只能由worker访问。
我真的希望这是可能的,否则除了显示alert()消息和更新页面HTML之外,我没有看到工作线程的用途。
答案 0 :(得分:0)
我真的希望这是可能的,否则除了显示alert()消息和更新页面HTML之外,我没有看到工作线程的用途。
它旨在处理通常会锁定浏览器的处理。非常适合处理画布和运行散列的数字。
在这种情况下,我所说的var是rw_resultRoute,我可以看到它在调试时设置正确。但唯一的问题是它是在工作线程中设置的,而不是在页面线程中设置的。
工作者与生成它的页面是分开的。传递数据的唯一方法是通过消息传递。您需要使用postMessage发送数据并让onMessage处理结果。如果您正在处理不同的事情,请设置switch语句来处理不同的消息类型。
答案 1 :(得分:0)
我解决了这个问题。有一些同步我没做正确。我以错误的方式使用了setTimeout。
var routeWorker = new Worker('getroute.js');
var checkPatrolRouteFoundTimer;
var rw_resultRoute;
var routeFound = false;
routeWorker.onmessage = function(e) {
rw_resultRoute = e.data.route;
routeFound = true;
}
function checkPatrolReady() {
if(routeFound) {
...
//do work on route
...
clearInterval(checkPatrolRouteFoundTimer);
} else {
// do any maint here?
}
}
function ForcePatrol(index) {
routeWorker.postMessage(index);
checkPatrolRouteFoundTimer = setInterval("checkPatrolReady()", 1000);
}
对setTimeout / setInterval的任何调用都将流经,在第一个例子中,我使用的是setTimeout而不是setInterval。
以新的方式,调用ForcePatrol将设置计时器,checkPatrolReady()将评估该标志,执行工作并清除计时器(如果为真)。
因此,从网络工作者那里获得结果确实没有什么花哨的东西,但我实际上是在创造了一个与工人结果竞争的条件。