首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AngularJS和web workers

AngularJS和web workers
EN

Stack Overflow用户
提问于 2013-05-23 20:26:57
回答 5查看 48.8K关注 0票数 75

angularJS如何使用web workers在后台运行进程?有没有什么我应该遵循的模式呢?

目前,我正在使用一个服务,该服务在单独的web worker中具有该模型。此服务实现如下方法:

代码语言:javascript
复制
ClientsFacade.calculateDebt(client1); //Just an example..

在实现中,此方法向worker发送一条包含数据的消息。这允许我抽象出它是在单独的线程中执行的这一事实,我还可以提供一个实现来查询服务器,甚至是在同一个线程中执行此操作的服务器。

因为我是javascript的新手,而且我只是在回收我从其他平台获得的知识,我想知道这是不是你会做的事情,或者也许我正在使用的Angular提供了一种这样做的方式。另外,这在我的体系结构中引入了更改,因为工作人员必须显式地将更改推送到控制器,然后控制器更新它的值,然后这反映在视图中,我是不是过度工程了?让人有点沮丧的是,网络工作者通过不让我分享记忆等方式来“保护”我不让我搞砸。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-05-24 16:38:23

与Web worker的通信是通过消息传递机制进行的。截获这些消息发生在回调中。在AngularJS中,放置web worker的最佳位置是在服务中,正如您适当注意到的那样。解决这个问题的最好方法是使用promises,Angular与promises配合使用的效果令人惊叹。

以下是service中的webworker示例

代码语言:javascript
复制
var app = angular.module("myApp",[]);

app.factory("HelloWorldService",['$q',function($q){

    var worker = new Worker('doWork.js');
    var defer = $q.defer();
    worker.addEventListener('message', function(e) {
      console.log('Worker said: ', e.data);
      defer.resolve(e.data);
    }, false);

    return {
        doWork : function(myData){
            defer = $q.defer();
            worker.postMessage(myData); // Send data to our worker. 
            return defer.promise;
        }
    };

});

现在,任何访问Hello World服务的外部实体都不需要关心HelloWorldService的实现细节- HelloWorldService可能会通过web workerhttp处理数据,或者直接在那里进行处理。

希望这是有意义的。

票数 99
EN

Stack Overflow用户

发布于 2015-02-18 04:44:11

一个非常有趣的问题!我发现web worker规范有点笨拙(可能有很好的理由,但仍然很笨拙)。需要将工作代码保存在单独的文件中,这使得服务的意图难以阅读,并在angular应用程序代码中引入了对静态文件URL的依赖。使用URL.createObjectUrl()可以缓解此问题,该方法可用于创建JavaScript字符串的URL。这允许我们在创建worker的同一文件中指定worker代码。

代码语言:javascript
复制
var blobURL = URL.createObjectURL(new Blob([
    "var i = 0;//web worker body"
], { type: 'application/javascript' }));
var worker = new Worker(blobURL);

web worker规范还将worker和主线程上下文完全分离,以防止出现死锁和活锁等情况。但这也意味着,如果不做一些改动,您将无法在worker中访问您的angular服务。worker缺少一些我们(和angular)在浏览器中执行JavaScript时所期望的东西,比如全局变量"document“等。通过在worker中”模仿“这些必需的浏览器功能,我们可以让angular运行。

代码语言:javascript
复制
var window = self;
self.history = {};
var document = {
    readyState: 'complete',
    cookie: '',
    querySelector: function () {},
    createElement: function () {
        return {
            pathname: '',
            setAttribute: function () {}
        };
    }
};

一些功能显然不会工作,绑定到DOM等。但是注入框架和例如$http服务将工作得很好,这可能是我们想要的worker。我们从中获得的好处是,我们可以在worker中运行标准的angular服务。因此,我们可以对worker中使用的服务进行单元测试,就像我们对任何其他角度依赖项所做的那样。

我写了一篇文章,详细介绍了这个here,并创建了一个github存储库,它创建了一个实现上面讨论的here思想的服务

票数 17
EN

Stack Overflow用户

发布于 2014-10-31 20:22:54

我在Angular here中找到了一个web工作者的完整工作示例。

代码语言:javascript
复制
webworker.controller('webWorkerCtrl', ['$scope', '$q', function($scope, $q) {

    $scope.workerReplyUI;
    $scope.callWebWorker = function() {
        var worker = new Worker('worker.js');
        var defer = $q.defer();
        worker.onmessage = function(e) {
            defer.resolve(e.data);
            worker.terminate();
        };

        worker.postMessage("http://jsonplaceholder.typicode.com/users");
        return defer.promise;
    }

    $scope.callWebWorker().then(function(workerReply) {
        $scope.workerReplyUI = workerReply;
    });

}]);

它使用promises来等待worker返回结果。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16713925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档