Как отклонить обещание от метода / функции обработчика

В настоящее время я создаю сервис в 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"})
    }
}

0 ответов

Другие вопросы по тегам