演示文稿显示以下代码作为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
无关?
答案 0 :(得分:1)
有一点需要注意,我不是WebWorker专家,我认为答案完全取决于工作代码的性质。由于工作者上下文与普通上下文一样是单线程的,如果工作者代码在获取消息后只是在某些计算上消失,并在完成后将响应发回,那么即使有其他请求待处理,它们也会等待。如果工作人员可能暂停并等待更多消息,则必须设置一些内容以将响应与所请求的内容相关联。
我认为,使用Web worker编写的任何类型的服务库最终可能看起来有点像Erlang系统,其中有一个用于浏览器上下文的前端API,用于管理传递给工作者和从工作者传递的消息。如果工作者通信需要匹配请求和响应,那么该前端库将负责处理(例如,通过将API参数包装在具有唯一请求标识符的对象中)。