javascript - $q.all 中的 Angular promises 没有被拒绝

标签 javascript angularjs promise

背景

我有一个实体层次结构,看起来像 (制造商 -> 车辆类型 -> 车辆模型 -> 车辆子模型)。每个制造商有多个车型,每个车型有多个车型,每个车型有多个子车型。

我需要检索给定制造商和类型的车辆模型列表,然后为每个模型检索其所有子模型 (getSubmodels)。一旦它们都被获取,我将它们放入一个 JSON 对象中。我正在尝试使用 Angular 的 $q 模块来确保在我继续执行之前已检索到所有子模型——也就是说,在我继续并呈现页面组件之前,我需要解决所有的 promise .

问题:

“快乐”路径完美运行,但如果其中一个子模型请求有错误,子模型函数拒绝的 promise 不会被 $q.all().then 阻止,因此整体 getVehicleHierarchy promise 不会被拒绝。

angular.module('uiApp.services.hierarchy', ['restangular'])
    .service('VehicleHierarchy', function VehicleHierarchy($http, $q, Restangular) {
        this.getVehicleHierarchy = function (manufacturerId, vehicleTypeId, vehicleModelId) {
            var that = this;
            var deferred = $q.defer();
            var promise = deferred.promise;
            var promises = [];
            Restangular.configuration.baseUrl = urlBuilder.buildHierarchyServiceUrl() + '/vehicle-hierarchy';
            Restangular.one('manufacturer', manufacturerId).one('type', vehicleTypeId).one('class', vehicleClassId).customGET('models')
                .then(function (models) {
                    var result = {};
                    _.forEach(models.result, function (model) {
                        result[parseInt(model.id)] = model;
                    });
                    _.forEach(result, function (model) {
                        promises.push(that.getSubmodels(manufacturerId, vehicleTypeId, vehicleClassId, model.id));
                    });
                    $q.all(promises).then(function (results) {
                        var i = 0;
                        _.forEach(result, function (model) {
                            result[parseInt(model.id)].subModels = results[i++];
                        }, function (errors) {
                            deferred.reject(errorResponse);
                        });
                        deferred.resolve(result);
                    });
                }, function(error) {
                    deferred.reject('error!');
                });
            return promise;
        };

        this.getSubmodels = function (manufacturerId, vehicleTypeId, vehicleClassId, modelId) {
            var submodels = {};
            var deferred = $q.defer();
            Restangular.configuration.baseUrl = urlBuilder.buildHierarchyServiceUrl() + '/vehicle-hierarchy';
            Restangular.one('manufacturer', brandId).one('type', vehicleTypeId).one('class', vehicleClassId).one('model', modelId)
                .customGET('submodels').then(function (submodelResponse) {
                    _.forEach(subclassResponse.result, function (subModel) {
                        subclasses[parseInt(subModel.id)] = subModel;
                    });
                    deferred.resolve(subclasses);
                }, function (error) {
                    deferred.reject('error'!);
                });
            return deferred.promise;
        };
    });
});

最佳答案

您需要在 then 中返回对错误函数的 $q.all 调用以捕获它:

return $q.all(promises).then(function (results) {

关于javascript - $q.all 中的 Angular promises 没有被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23771990/

相关文章:

javascript - 使用正则表达式在javascript中的几种不同类型的标签之间选择文本

angularjs - 使用 AngularJS 在 Session 中存储数据

javascript - JavaScript/Nodejs 中 Json 数据中父级下的 TBD 总数

javascript - Angular - 添加基于 JSON 数据的样式

javascript - Angularjs 1.5 : replace component tag with html tag

javascript - 如何等待多个嵌套数组

javascript - Azure B2C - MSAL 回调方法不调用返回 promise 的方法?

javascript - 在 VS Code "Debug Console"中,运行 JavaScript 等待函数

javascript - 搜索字符串中的值,然后更新字符串

javascript - 如何在 LI 中强制 DIV(带有溢出隐藏样式)仍然显示