[英]Difference between finally() and then() in ES2018
ES2018之前,我曾經巢額外then
在承諾鏈的末端,每當我不得不執行任何清理邏輯,我想重復的,否則在then
和catch
更高,如
new Promise( (res, rej) => setTimeout(() => rej({}), 1000) ).then( res => console.log(res) ).catch( err => console.error(err) ).then( () => console.log('Finally') )
但現在finally
是在加入Promise
原型,我看不出它是如何從過去的不同then
在上面的方法。 以下將產生相同的輸出。
new Promise( (res, rej) => setTimeout(() => rej({}), 1000) ).then( res => console.log(res) ).catch( err => console.error(err) ).finally( () => console.log('Finally') )
finally
是否僅在本機Promise API中提供了語義目的?
then
回調在承諾被拒絕時不會執行-即使是catch
調用返回的承諾也可能發生:當其回調拋出或返回被拒絕的承諾時。 err => console.error(err)
可能不會這樣做,但您永遠不會知道。
同樣,如果您只想處理原始承諾中的錯誤,而不是then
回調中的錯誤,我建議使用.then(…, …)
不是.then(…).catch(…)
。 我會寫
promise.then(console.log, console.error).finally(() => console.log('Finally'));
其他的或多或少明顯的區別在於簽名: finally
回調不接收任何參數,並且p.finally()
返回的承諾將以與p
相同的結果實現/拒絕(除非存在異常或返回的拒絕)在回調中)。
finally()
執行諾言是否兌現。 也許MDN doc的示例會有所幫助。
編輯:MDN文檔提供了與then()
這些區別:
finally()
方法與調用.then(onFinally, onFinally)
非常相似.then(onFinally, onFinally)
但是有一些區別:
- 在創建函數內聯時,您可以傳遞一次,而不必被強制聲明兩次或為其創建變量
- 由於沒有可靠的方法來確定諾言是否已兌現,因此
finally
回調將不會收到任何參數。 正是這種用例適用於您不關心拒絕原因或實現價值的情況,因此不需要提供它。- 與
Promise.resolve(2).then(() => {}, () => {})
(將使用undefined
解析)不同,Promise.resolve(2).finally(() => {})
將用2
解決。- 同樣,與
Promise.reject(3).then(() => {}, () => {})
(將通過undefined
來實現)不同,Promise.reject(3).finally(() => {})
將被3
拒絕。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.