您可以仅使用 Angular 的实现来解决您的问题,您需要做的是隔离其他函数中的异步调用,该函数将返回一个 Promise,并且该 Promise 将为您管理。
举个例子,假设你有四个异步调用,每个函数调用一个具有授权控制的端点,如果用户没有所有权限,调用将失败
function getAllCatalogs() {
return $q.all([
$http.get(baseUrl + 'equipment-design/'),
$http.get(baseUrl + 'engines-design/'),
$http.get(baseUrl + 'suspension-design/'),
$http.get(baseUrl + 'artifacts-design/')
]).then(function (data) {
return data;
});
}
由于 $q.all 需要如果之前的调用之一由于用户没有权限而失败,则所有承诺都令人满意地完成整个调用将失败,但也许你对调用何时失败感兴趣返回一个空数组或默认对象,因此您必须自己处理此行为,为此您必须创建一个函数,该函数负责调用 $http.get 服务并管理如何一旦调用失败或成功,promise 将被返回,对于这个例子,让我们调用该函数 getCatalogPromise 并且在它的参数中将是服务的 URL,代码将是:
function getCatalogPromise(url) {
var deferred = $q.defer();
$http.get(url).then(function (response) {
deferred.resolve(response)
}, function () {
deferred.resolve([]);
})
return deferred.promise;
}
function getAllCatalogs() {
return $q.all([
getCatalogPromise(baseUrl + 'equipment-design/'),
getCatalogPromise(baseUrl + 'engines-design/'),
getCatalogPromise(baseUrl + 'suspension-design/'),
getCatalogPromise(baseUrl + 'artifacts-design/')
]).then(function (data) {
return data;
});
}
如果您注意 getCatalogPromise 的代码,那么返回对我们延迟的服务的调用将始终处于解析状态并不重要,这就是 $q .all 想要,唯一的区别是如果服务失败我们返回一个空数组。