【发布时间】:2014-10-16 05:10:14
【问题描述】:
对于我的 Angular 应用程序,我正在尝试跟踪已处理的承诺数量以及仍需要处理的承诺数量。
我的代码用包装器方法装饰 $q,每当操作开始和完成时更新一个简单的计数器,看起来很简单:
angular.module('DuckieTV',[])
.config(function($provide) {
var count = window.promiseStats = {
open: 0,
done: 0
};
$provide.decorator('$q', function($delegate) {
function decorate(p) {
p._then = p.then;
p.then = function(thenFn, errFn, notifyFn) {
count.open++;
return p._then(function() {
count.done++;
if(thenFn) return thenFn.apply(this,arguments)
}, function() {
count.done++;
if(errFn) return errFn.apply(this,arguments)
}, notifyFn);
};
p._finally = p.finally;
p.finally = function(callback) {
count.done++;
p._finally(callback)
}
p._catch = p.catch;
p.catch = function(callback) {
count.done++;
p._catch(callback)
}
return p;
}
var d = $delegate.defer;
$delegate.defer = function() {
var deferred = d();
decorate(deferred.promise);
return deferred;
};
return $delegate;
});
})
当我注意到开始/完成的承诺之间存在差异时,乐趣就开始了。在执行大量延迟操作只需几分钟后,总体上它可以达到 > 15% 的百分比。
控制台输出示例:
promiseStats
Object {open: 99, done: 95}
Math.floor(promiseStats.done / promiseStats.open * 100);
94
经过一些工作(导入操作)
promiseStats;
Object {open: 185, done: 172}
Math.floor(promiseStats.done / promiseStats.open * 100);
92
我的实际问题:谁能告诉我这个实现是否遗漏了什么?
据我所知,我没有错过可选实现,并且我通过 .then 触发的所有承诺都已正确编码
【问题讨论】:
-
谢谢@bergi,这可能会很有趣。
-
我会把它变成答案
标签: javascript angularjs profiling promise angular-promise