由于 OP 要求,这是基于我们用于当前正在开发的应用程序的方法。此方法不会改变的行为$q
,而是添加了一个非常简单的API 来处理需要某种视觉指示的 Promise。尽管这需要在使用它的每个地方进行修改,但它只是一个衬里。
用法
例如,有一个服务ajaxIndicator
知道如何更新 UI 的一部分。每当类似 Promise 的对象需要提供指示直到 Promise 被解决时,我们使用:
// $http example:
var promise = $http.get(...);
ajaxIndicator.indicate(promise); // <--- this line needs to be added
如果您不想保留对 Promise 的引用:
// $http example without keeping the reference:
ajaxIndicator.indicate($http.get(...));
或使用资源:
var rc = $resource(...);
...
$scope.obj = rc.get(...);
ajaxIndicator.indicate($scope.obj);
(注意:对于 Angular 1.2,这需要 tweeking,因为$then()
资源对象上没有。)
现在在根模板中,您必须将指标绑定到$rootScope.ajaxActive
,例如:
<div class="ajax-indicator" ng-show="ajaxActive"></div>
执行
(从我们的源代码修改。)警告:此实现不考虑嵌套调用!(我们的要求要求 UI 阻塞,所以我们不期望嵌套调用;如果有兴趣,我可以尝试增强此代码。)
app.service("ajaxIndicator", ["$rootScope"], function($rootScope) {
"use strict";
$rootScope.ajaxActive = false;
function indicate(promise) {
if( !$rootScope.ajaxActive ) {
$rootScope.ajaxActive = true;
$rootScope.$broadcast("ajax.active"); // OPTIONAL
if( typeof(promise) === "object" && promise !== null ) {
if( typeof(promise.always) === "function" ) promise.always(finished);
else if( typeof(promise.then) === "function" ) promise.then(finished,finished);
else if( typeof(promise.$then) === "function" ) promise.$then(finished,finished);
}
}
}
function finished() {
$rootScope.ajaxActive = false;
}
return {
indicate: indicate,
finished: finished
};
});