【发布时间】:2016-02-05 01:13:54
【问题描述】:
我有一个 Angular 服务,我将$q 服务与网络工作者结合使用。在我使用 webworkers 之前的原始函数中,我的 completeClass 函数将返回一个对象。
我替换了代码以向我的新 Web Worker 脚本发布消息。
webworker 的回调在我的initWorkers 函数中,我在其中添加了事件监听器。
我的目标是 completeClass 函数返回 webworker 的结果。我怎样才能做到这一点?
this.classWorker = new Worker('app/shared/autocomplete/autocomplete-class-worker.js');
this.completeClass = function(text){
var self = this;
var defer = $q.defer();
classWorker.postMessage([text, this.oldText, this.oldProposals, this.aliases, this.entityClasses])
};
this.initWorkers = function(){
var self = this;
worker.addEventListener('message', function(e) {
defer.resolve(e.data);
self.oldProposals = e.data[1];
self.oldText = text;
return e.data[0];
}, false);
};
【问题讨论】:
-
你的意思是你想为结果返回一个承诺?如果您不异步执行此操作,则使用 webworker 将没有任何意义。
-
所有
worker、defer和text在您的initWorkers方法中都未定义,您也不能在事件回调中return。 -
@Bergi 问题是“CompleteClass”函数太占用 CPU,所以我将它移到了 webworker 上,以便它在单独的线程上运行。完成后,我想返回结果。所以是的,它异步运行。我对所有关于 'defer' 、 'promise' 和 'resolve' 的术语有点迷茫,所以我不确定我需要什么。
-
@Bergi 我曾经在我的 completeClass 函数中有 addEventListener,但是每次我调用该函数时它都会添加监听器
-
要多次调用函数吗?甚至多次,而之前的结果可能还没有返回?那么无论如何它会变得更加复杂。
标签: javascript angularjs asynchronous promise web-worker