使用 Web Worker 卸载工作

Using a Web Worker to offload work

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

代码的目的是将与 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 回调接收到的消息可能与 "corresponding" postMessage 无关?

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

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