Closed 3bch closed 10 years ago
確認しました。確かにthenのコールバックが返したプロミスについてのcfhは動作しませんでした。 原因は、thenのコールバックがpromiseを返した時にjQuery内部でそのプロミスに対してfail()を呼んでいるためです。
h5.settings.commonFailHandler(function() {
console.warn('CFH');
});
var d1 = h5.async.deferred();
var d2 = h5.async.deferred();
d1.then(function() {
return d2.promise();
// thenの返り値にプロミスを渡すとjQueryがそのプロミスのfail()を呼ぶ
});
d1.resolve();
// jQueryによってd2のfailが呼ばれた状態なので、reject()してもCFHは動作しない
d2.reject();
ユーザコード側でfailコールバックを登録していないのにCommonFailHandlerが呼ばれないのは意図しない動作ですので、対応します。
今は、thenをラップしてその中でjQueryのthenをapply()している実装ですが、その実装である限り回避できない問題と思われますので、thenをFW側で実装します。
pipeも同じ問題があるので、同様に対応します。
then/pipeの実装を行いましたが、バグがありました。 pipeのコールバックが返したプロミスがreject();されても、pipeの戻り値のプロミスがrejectされていません。
var d = h5.async.deferred();
var a = d.pipe(function() {
console.log('done');
return h5.async.deferred().reject().promise()
});
d.resolve();
a.fail(function(){
// 実行されるべきなのに実行されない。
});
a.state(); // rejectedになるべきなのにpendingになっている。
確認した環境
問題発生の状況
以下のようなコードを書いたとき result に fail() を設定していないのに commonFailHandler が実行されません。