簡體   English   中英

ES2018中的finally()和then()之間的區別

[英]Difference between finally() and then() in ES2018

ES2018之前,我曾經巢額外then在承諾鏈的末端,每當我不得不執行任何清理邏輯,我想重復的,否則在thencatch更高,如

 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM