繁体   English   中英

$ q.all中的有角承诺不会被拒绝

[英]Angular promises in $q.all are not being rejected

背景

我有一个看起来像(Manufacturer -> Vehicle Type -> Vehicle Model -> Vehicle Submodel)的实体层次结构。 每个制造商都有多种车辆类型,每种车辆类型都有多种型号,每种型号都有多种子型号。

我需要检索给定制造商和类型的车辆模型的列表,然后对于每个模型,检索其所有子模型( getSubmodels )。 将它们全部提取后,我将其放入JSON对象。 我正在尝试使用Angular的$q模块来确保在继续执行之前已检索到所有子模型-aka我需要先解决所有诺言,然后才能继续并呈现页面组件。

问题:

“快乐”路径可以正常工作,但是,如果$q.all().then模型的请求之一出错,则子模型函数拒绝的承诺不会被$q.all().then块捕获,因此整个getVehicleHierarchy承诺都会不被拒绝。

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;
        };
    });
});

您需要返回$q.all呼吁您的误差函数中then抓住它:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM