在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
答案 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/中的示例作为指导,以便快速向您展示如何做到这一点。让工作人员完成繁重的工作,只将您需要的数据传回给应用程序。