Javascript 使用Web Worker卸载工作
演示文稿显示了以下代码作为Promisify功能的示例 代码的目的是将与JSON相关的计算卸载给Web工作者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
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我接受这个答案。