-1
我想了解Promises如何使用jQuery。 這是我的沙箱:jQuery推遲/ 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();
}
其寫入到控制檯:在測試1 2
test2的成品不確定
的是不是事實
東西失敗了,因爲test2的尚未執行,甚至。
我想,「test2完成未定義」不應該顯示。
我猜在第二時間有什麼不對,但是什麼?
您或者需要在錯誤處理程序中調用'test2',或者您需要僅在test2()'promise上安裝「test 2 finished」記錄結果處理程序,否則您將不需要在它之前趕上錯誤。 – Bergi
聽起來像你學習jQuery 1.x/2.x中的Deferreds/Promises,你現在使用3.x,它的行爲不同(也就是正確)。在3.x中,缺省捕獲處理程序('.then()'的第二個參數) - 承諾鏈沿着其成功路徑繼續向下,除非拋出/重新拋出錯誤,或者返回的承諾(最終)被拒絕。 –