我有以下代碼(http://jsfiddle.net/tj1eo86s/):有沒有什麼辦法在處理錯誤時鏈接承諾,就好像承諾被嵌套一樣?
promise(1).then(function() {
console.log("OK1");
promise(2).then(function() {
console.log("OK2");
promise(3).then(function() {
console.log("OK3");
}, function() {
console.log("KO3");
});
}, function() {
console.log("KO2");
});
}, function() {
console.log("KO1");
});
如果承諾(2)被拒絕,輸出將是:
OK1
KO2
我怎樣才能獲得相同的行爲,而鏈接的承諾?
我試着用(http://jsfiddle.net/7goh0ds9/):
promise(1)
.then(function() {
console.log("OK1");
return promise(2);
}, function() {
console.log("KO1");
})
.then(function() {
console.log("OK2");
return promise(3);
}, function() {
console.log("KO2");
})
.then(function() {
console.log("OK3");
}, function() {
console.log("KO3");
});
但輸出是:
OK1
KO2
OK3
然後我試圖把在錯誤回調錯誤(http://jsfiddle.net/cyx6mohy/):
promise(1)
.then(function() {
console.log("OK1");
return promise(2);
}, function() {
console.log("KO1");
throw "KO1";
})
.then(function() {
console.log("OK2");
return promise(3);
}, function() {
console.log("KO2");
throw "KO2";
})
.then(function() {
console.log("OK3");
}, function() {
console.log("KO3");
throw "KO3";
});
但現在我有:
OK1
KO2
KO3
我實際上理解了所有這些行爲,但我一直無法找到解決方案來處理錯誤,就好像承諾被嵌套一樣。
我不太明白你的問題究竟是什麼。嵌套與鏈接是不同的結構,因此很難弄清楚如何讓一個結構在概念上與另一個結構行爲相同。當你得到一個被拒絕的承諾時,你完全控制下一步發生的事情。如果你處理拒絕,那麼你從拒絕處理程序返回的任何內容都將成爲延續值。如果拋出或返回拒絕處理程序拒絕的承諾,則父承諾將被拒絕,鏈中的下一個拒絕處理程序將被調用。接下來的評論中繼續... – jfriend00
如果您處理拒絕並且不拋出或返回被拒絕的承諾,那麼鏈中的下一個成功處理器將被調用。通過「處理」拒絕並且不返回繼續錯誤,您已經「處理」了錯誤並繼續正常的成功處理。 – jfriend00
@ jfriend00是的,謝謝你的解釋,這也是我讀過的(這就是爲什麼我說我實際上理解了所有這些行爲)。關鍵在於,我發現鏈式承諾比嵌套承諾更具可讀性和可維護性(特別是當您有許多承諾時),但嵌套承諾實際上按我需要的方式行事。所以問題是:當鏈接承諾時,如何處理錯誤,就像它們在承諾嵌套時處理一樣。 – sp00m