使用Web Worker卸载工作

时间:2015-12-07 22:12:21

标签: javascript web-worker

演示文稿显示以下代码作为promisifying功能的示例。

目的是让代码将与JSON相关的计算卸载到Web Worker。

var worker = new Worker('asyncTask.js');

function work(json) {    
    return new Promise(function(resolve, reject) {
      function onMessage() {
        worker.removeEventListener('message', onMessage);
        resolve.apply(this, arguments)
      }

      worker.addEventListener('message', onMessage);
      worker.postMessage(json);
    });
}

我是否正确地说,此代码容易受到竞争条件的影响,因为onMessage回调收到的邮件可能与“对应”postMessage无关?

1 个答案:

答案 0 :(得分:1)

有一点需要注意,我不是WebWorker专家,我认为答案完全取决于工作代码的性质。由于工作者上下文与普通上下文一样是单线程的,如果工作者代码在获取消息后只是在某些计算上消失,并在完成后将响应发回,那么即使有其他请求待处理,它们也会等待。如果工作人员可能暂停并等待更多消息,则必须设置一些内容以将响应与所请求的内容相关联。

我认为,使用Web worker编写的任何类型的服务库最终可能看起来有点像Erlang系统,其中有一个用于浏览器上下文的前端API,用于管理传递给工作者和从工作者传递的消息。如果工作者通信需要匹配请求和响应,那么该前端库将负责处理(例如,通过将API参数包装在具有唯一请求标识符的对象中)。