更新:
この投稿の将来の視聴者を支援するために、私はこの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の例は、まったく同じ問題の解決策を示しています。