jQueryを使用してPromisesの仕組みを理解しようとしています。足す - 私は期待どおりに動作しますjQuery Deferred/Promises
function test1() {
var deferred = $.Deferred()
setTimeout(function() {
deferred.resolve(1);
//deferred.reject(2);
}, 2000);
return deferred.promise();
}
function test2() {
var deferred = $.Deferred()
setTimeout(function() {
deferred.resolve(2);
// deferred.reject(2);
}, 1000);
return deferred.promise();
}
function doTest(){
$.when(test1()).then(
function (a) {
console.log('test1 finished', a)
return test2();
},
function (a) {
console.log('something failed in test1', a)
}
).then(
function (b) {
console.log("test2 finished", b);
},
function (b) {
console.log("something failed in test1", b);
}
);
}
:
test1の1
TEST2が
2を終え終えしかし、私は以下のようにそれを変更したとき が、これは私のサンドボックスです:
function test1() {
var deferred = $.Deferred()
setTimeout(function() {
// deferred.resolve(1);
deferred.reject(2);
}, 2000);
return deferred.promise();
}
function test2() {
var deferred = $.Deferred()
setTimeout(function() {
deferred.resolve(2);
// deferred.reject(2);
}, 1000);
return deferred.promise();
}
それはコンソールに書き込み:
何かがTEST2も実行されていないので、事実ではないものを未定義
終了test1の2
TEST2に失敗しました。
"test2 finished undefined"は表示しないでください。
私は何か間違っていると思いますが、何ですか?
エラーハンドラでも 'test2'を呼び出す必要があります。あるいは、' test2 finished' -logging結果ハンドラを 'test2()'約束だけにインストールする必要があります。その前にエラーをキャッチします。 – Bergi
jQuery 1.x/2.xのDeferreds/Promisesについて学んだことがあり、現在は3.xを使用していますが、動作が異なります。 3.xでは、キャッチハンドラ( '.then()'の2番目の引数)がデフォルトでキャッチします - エラーがスローされたり再スローされたり、(最終的に)拒否されたという約束が返されない限り、 。 –