Angular 应用程序中是否存在用于计算繁重任务的模式?(不仅仅是使用延迟为 0 的 $timeout 让他们离开调用堆栈?)即使使用 $timeout 似乎也会在处理本身启动时使 UI 无响应。我是否需要查看 Web Workers 或类似的东西那个,还是有“角度方式”?
问问题
2940 次
2 回答
2
因为 JavaScript 是单线程的,所以您需要在服务器端进行计算,或者在处理之间进行超时(参见下划线的defer()
http://underscorejs.org/#defer )。否则,UI 将不可避免地被阻塞。
于 2013-06-25T14:17:51.607 回答
2
我想出了一种方法来解决我的 UI 响应问题,方法是创建$timeout
每次通过循环都使用 Angular 的特殊循环函数。
app.service('responsivenessService', function($q, $timeout) {
var self = this;
// Works like Underscore's map() except it uses setTimeout between each loop iteration
// to try to keep the UI as responsive as possible
self.responsiveMap = function(collection, evalFn)
{
var deferred = $q.defer();
// Closures to track the resulting collection as it's built and the iteration index
var resultCollection = [], index = 0;
function enQueueNext() {
$timeout(function () {
// Process the element at "index"
resultCollection.push(evalFn(collection[index]));
index++;
if (index < collection.length)
enQueueNext();
else
{
// We're done; resolve the promise
deferred.resolve(resultCollection);
}
}, 0);
}
// Start off the process
enQueueNext();
return deferred.promise;
}
return self;
});
此映射函数返回一个可以分配给$scope
. 用法类似于map()
较新浏览器中来自下划线或原生 Javascript 数组的函数:
$scope.results = responsivenessService.responsiveMap(initialdata, function() {
// Long-running or computationally intense code here
return result;
});
原本会阻止整个 UI 的代码现在似乎在后台运行(尽管本质上这是一种错觉,就像在旧应用程序中定期调用 Application.DoEvents)。好用又通用,只要长时间运行的代码有利于循环 map() 式的操作!
于 2013-06-25T20:27:46.230 回答