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

Обновить:

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

Вопрос:

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

  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) воля, которую я понимаю. Я достиг всего, кроме того, что я пытаюсь сделать.

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

Вот живая демонстрация так что у вас есть с чем поработать.

Обновить:

I Что-то вроде решили это. Здесь я улавливаю ошибку в конце цепочки и передаю данные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)

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