Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用Web Worker卸载工作_Javascript_Web Worker - Fatal编程技术网

Javascript 使用Web Worker卸载工作

Javascript 使用Web Worker卸载工作,javascript,web-worker,Javascript,Web Worker,演示文稿显示了以下代码作为Promisify功能的示例 代码的目的是将与JSON相关的计算卸载给Web工作者 var worker = new Worker('asyncTask.js'); function work(json) { return new Promise(function(resolve, reject) { function onMessage() { worker.removeEventListener('message', o

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

代码的目的是将与JSON相关的计算卸载给Web工作者

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
无关,对吗?

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


我的想法是,任何为使用WebWorkers而编写的服务库最终都可能看起来有点像Erlang系统,具有用于浏览器上下文的前端API,用于管理传入和传出worker的消息。如果工作者通信需要匹配请求和响应,那么前端库将负责处理(比如,通过将API参数包装到具有唯一请求标识符的对象中)我认为这取决于相关工作者的性质。如果它只对一个“消息”事件进行直接计算,然后在完成时进行响应,那么它就无法在该点之前获得另一个事件。不过,它肯定可以写成其他形式。@Pointy我接受这个答案。