更新:
この投稿の将来の視聴者を支援するために、私はこの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)ANDとANDの両方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); 
  }
          Promise.prototype.catch()MDNの例は、まったく同じ問題の解決策を示しています。