javascript Web worker - 将数据传递给页面线程

时间:2010-12-12 00:49:28

标签: javascript html5

如果我的主页上有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之外,我没有看到工作线程的用途。

2 个答案:

答案 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()将评估该标志,执行工作并清除计时器(如果为真)。

因此,从网络工作者那里获得结果确实没有什么花哨的东西,但我实际上是在创造了一个与工人结果竞争的条件。