所以我最近决定从AngularJS制作一个空闲的游戏,但经过几天的编码后我发现了一个问题。
如果没有主动查看屏幕,$ interval功能会减慢巨大金额。
在Google上搜索和stackoverflow将我带到网络工作者,一篇文章实际上让我弄清楚如何让一个网络工作者的工厂实现到我的控制器,但我从来没有弄清楚如何让他们运行功能(或者如果可能的话)。
myApp.factory("interval", ['$q',
function($q) {
var blobURL = URL.createObjectURL(new Blob([
'function addInterval() {' +
'i = "add()";' +
'postMessage(i);' +
'setTimeout("addInterval()", 10);' +
'}' +
'addInterval();' +
'function saveInterval() {' +
'x = "save()";' +
'postMessage(x);' +
'setTimeout("saveInterval()", 30000);' +
'}' +
'saveInterval();'
], {
type: 'application/javascript'
}));
var worker = new Worker(blobURL);
var defer = $q.defer();
worker.addEventListener('message', function(e) {
defer.resolve(e.data);
}, false);
return {
doWork: function(myData) {
defer = $q.defer();
worker.postMessage(myData); // Send data to our worker.
return defer.promise;
}
};
}
]);

我几乎想知道是否可以让web worker运行控制器中的save()和interval()函数。我尝试了console.log(defer.resolve(e.data)),但它返回undefined。 ......我完全不知道推迟/解决/承诺甚至是什么。
谢谢!
答案 0 :(得分:0)
所以在斯科特纠正我关于网络工作者如何运作之后我决定将间隔从10毫秒设置为1000毫秒......并且被击败......
...但后来我得到了#34的好主意;怎么样而不是一个固定的速率,我取消页面/标签模糊的间隔(没有聚焦)并改变间隔+因此划分!"。这就是我提出来解决我的问题并使游戏继续运行 - 即使没有查看它。
$scope.division = 100;
var x = $interval(add, 10);
angular.element($window).bind('focus', function() {
$scope.division = 100;
$interval.cancel(x);
x = $interval(add, 10);
}).bind('blur', function() {
$scope.division = 1;
$interval.cancel(x);
x = $interval(add, 1000);
});