访问Web worker中的Angular $ Scope

时间:2014-12-31 08:11:30

标签: javascript angularjs web-worker

在Web Workers中访问角度$ scope数据的常见做法是什么?

我正在尝试与parallel.js库结合使用。

$scope.variant = 7;
$scope.final = 0;
var p = new Parallel([0, 1, 2, 3, 4, 5, 6]),
log = function () { console.log(arguments); };

function fun(n) {
   $scope.final += n * $scope.variant;
};

p.map(fun).then(log)

我收到以下错误:

 Uncaught ReferenceError: $scope is not defined

1 个答案:

答案 0 :(得分:0)

Web Workers产生一个新线程,这会产生一个新的Angular应用程序实例,因此代码永远不会连接到您的主应用程序,除非您找到一种与之通信的外部方式(sessionStorage,localStorage,cookies,API调用,等等。)。但是你需要以某种方式传递你想要的范围。

但一般情况下,我认为让两个线程在相同的$ scope上工作是个好主意(即使你设法做到这一点)。 Web Workers通常用于从主应用程序中独立的一些重要内容,这会导致您返回主应用程序以供进一步使用(考虑渲染超级复杂的图像,然后将其传递回主应用程序,所以你可以将它用作背景或其他东西)。


更新

所以这里可能是最简单的方法的简短例子。你不会在worker脚本中使用Angular,但是尽可能简单地遍历这些文件:

控制器

var worker = new Worker('iterator.js');

worker.addEventListener('message', function(e) {
  console.log('Worker said: ', e.data);
  $scope.final = e.data; // for example
  $scope.$apply();       // launch a digest cycle
}, false);

工作人员脚本

function iterate() {
    // iteration and data collection stuff here
    // send the needed data afterwards: 
    self.postMessage(collectedData);
}

您还可以向worker发送参数,并使用参数等调用iterate函数。

我已将http://www.html5rocks.com/en/tutorials/workers/basics/中的示例作为指导,以便快速向您展示如何做到这一点。让工作人员完成繁重的工作,只将您需要的数据传回给应用程序。