Как отклонить обещание от метода / функции обработчика
В настоящее время я создаю сервис в angularJS (v1.4.14) с использованием нового синтаксиса класса ES6 и имею связанное / сплющенное дерево обещаний с 3 .then()
Метод setCampaign() разрешается в состоянии с помощью ui-router. Когда возникает проблема с данными (например, нет поля id в приведенном ниже примере), я хочу отклонить обещание, чтобы слушатель маршрутизатора '$stateChangeError' поднял отклоненный объект и перенаправил его в состояние ошибки.
Я борюсь с тем, как отказаться от обещания (и разорвать цепь), если что-то пойдет не так.
Я знаю, что могу использовать $q.reject, если не извлекаю свои обработчики для разных имен методов, например так:
setCampaign(){
let deferred = this._$q.defer();
this._ApiService.get({entity: 'campaign'}).$promise.then(
campaignResponse => {
if (campaignResponse.status == 'success' && campaignResponse.data.id){
//assign to the campaign property and return to next .then()
this.campaign = campaignResponse.data
//call next promise
this.Api.get({entity: 'campaign-info', entity_id: campaignResponse.data.id }).$promise.then(
//handle response and get forever more indented ugly code
campaignInfoResponse => {
//do more stuff ...
return deferred.resolve(data);
}
)
}
//break the chain
return deferred.reject(({status:"error", message: "blah blah"})
});
return deferred.promise
}
Но я хочу написать код, который не имеет отступа до миллионной степени и выглядит более элегантно. Когда я делаю это, я, кажется, не могу отказаться от обещания. Кто-нибудь может помочь?
class CampaignService{
constructor($q, ApiService){
'ngInject';
this._$q = $q;
this._ApiService = ApiService;
}
setCampaign(){
return this._ApiService.get({entity:'campaign'})
.then(this.assignCampaign)
.then(this.getCampaignTheme)
.then(this.assignTheme)
.catch(this.errorHandler);
}
assignCampaign(campaignResponse){
if(campaignResponse.status == 'success' && campaignResponse.data.id){
//assign to the campaign property and return to next .then()
this.campaign = campaignResponse.data
return campaignResponse.data
}
//break the chain
return this._$q.reject({status:"error", message: "blah blah"})
}
}