Разорвать цепочку обещаний и вызвать функцию, основанную на шаге в цепочке, где она нарушена (отклонено)

Обновить:

Чтобы помочь будущим зрителям этого поста, я создалэто демо pluma 'ответ.

Вопрос:

Моя цель кажется довольно простой.

  step(1)
  .then(function() {
    return step(2);
  }, function() {
    stepError(1);
    return $q.reject();
  })
  .then(function() {

  }, function() {
    stepError(2);
  });

  function step(n) {
    var deferred = $q.defer();
    //fail on step 1
    (n === 1) ? deferred.reject() : deferred.resolve();
    return deferred.promise;
  }
  function stepError(n) {
    console.log(n); 
  }

Проблема здесь заключается в том, что если мне не удастся выполнить шаг 1, обаstepError(1) А ТАКЖЕstepError(2) уволены. Если я неreturn $q.reject затемstepError(2) победил'не быть уволенным, ноstep(2) воля, которую я понимаю. Я'мы выполнили все, кроме того, что яЯ пытаюсь сделать.

Как мне написать обещания, чтобы я мог вызвать функцию при отклонении, не вызывая все функции в цепочке ошибок? Или есть другой способ сделать это?

Вот'живая демонстрация так что вы'У меня есть кое-что для работы.

Обновление: Я

вид решили это. Здесь я улавливаю ошибку в конце цепочки и передаю данныеreject(data) так что я буду знать, какую проблему решить в функции ошибки. Это на самом деле нене соответствует моим требованиям, потому что я неЯ не хочу зависеть от данных. Это было бы неэффективно, но в моем случае было бы яснее передать функцию обратного вызова с ошибкой, а не зависеть от возвращаемых данных, чтобы определить, что делать.

Живая демо здесь (нажмите).

step(1)
  .then(function() {
    return step(2);
  })
  .then(function() {
    return step(3);
  })
  .then(false, 
    function(x) {
      stepError(x);
    }
  );
  function step(n) {
    console.log('Step '+n);
    var deferred = $q.defer();
    (n === 1) ? deferred.reject(n) : deferred.resolve(n);
    return deferred.promise;
  }
  function stepError(n) {
    console.log('Error '+n); 
  }

Ответы на вопрос(9)

Ваш ответ на вопрос