我正在开发一个复杂的 angularjs 应用程序。复杂含义单一视图可以从代码的不同位置查询多个不同的数据源,例如页面部分控制器或指令控制器。有时,其中一些请求可能需要更长的时间才能解决,从而使视图处于某种无效状态。我希望能够显示某种“数据加载”横幅并禁用用户与视图的交互,直到所有承诺都得到解决。这适用于使用 $q.all() 函数的简单屏幕。但是,应用程序的构建方式更加以业务逻辑为中心,而不是以数据源为中心。因此,对于更复杂的屏幕,不会有一个地方可以自然地访问所有的承诺。在代码中创建这样一个地方似乎很麻烦。
我想出了这个解决方案:
angular.module('myApp').service('qConfigurer', function ($q) {
var pending = 0;
var origDefer = $q.defer;
$q.defer = function() {
pending++;
var result = origDefer.apply(arguments);
var origResolve = result.resolve;
var origReject = result.reject;
result.resolve = function() {
pending--;
return origResolve.apply(arguments);
};
result.reject = function() {
pending--;
return origReject.apply(arguments);
};
return result;
};
$q.pending = function() {
return pending;
};
return {};
});
是否有更少的hacky来实现相同的目标?