當Promise
被拒絕,而.then()
出現在.catch()
之後時,拒絕被捕獲,但接下來仍然運行(請參閱下面的示例then
)。Promise被拒絕時,Promise連鎖訂單有什麼作用?
然而,當一個Promise
解決,並.then()
來.catch()
之前,拒絕被捕獲,並.then()
不會被調用。
爲什麼這兩種情況的行爲有所不同,以及在發生拒絕後發生.then()
調用會有什麼用處?
var then = Promise.reject()
.catch(() => 'catch')
.then(() => document.getElementById('then').innerHTML = 'then');
var noThen = Promise.reject()
.then(() => document.getElementById('noThen').innerHTML = 'then')
.catch((err) => 'catch');
https://jsfiddle.net/mmyj61dd/
編輯:
一個有趣的相關例子,說明.then()
如何依賴於它傳遞函數的參數:
var then = Promise.reject()
.then((undefined, err) => 'catch')
.then((asdf) => document.getElementById('then').innerHTML = 'then');
var noThen = Promise.reject()
.then((asdf) => document.getElementById('noThen').innerHTML = 'then')
.then((undefined, err) => 'catch');
只有(undefined, err) => 'catch'
功能得到在這兩種情況下稱爲這裏。
https://jsfiddle.net/ro0cv1p1/2/
但它具有邏輯意義,不是嗎? – Li357
'catch'就像是在'finally'之後'then'因此最終的行爲類似於Javascript - > https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/try ...趕上 – Keith
取決於你如何編寫你的.then。回調的第一個參數在履行承諾時運行,第二個(可選)參數在承諾被拒絕時運行。趕上,然後不是對立的。如果你願意,你可以使用第二個參數來「然後」,而不是單獨的「catch」。寫不同的方法來寫同一件事。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then和https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ Global_Objects/Promise/catch解釋它 – ADyson