【譯】ES2018 新特性:Promise.prototype.finally()

mogic發表於2018-07-09

Jordan Harband 提出了 Promise.prototype.finally 這一章節的提案。

如何工作?

.finally() 這樣用:

promise
.then(result => {···})
.catch(error => {···})
.finally(() => {···});
複製程式碼

finally 的回撥總是會被執行。作為比較:

  • then 的回撥只有當 promise 為 fulfilled 時才會被執行。
  • catch 的回撥只有當 promise 為 rejected,或者 then 的回撥丟擲一個異常,或者返回一個 rejected Promise 時,才會被執行。 換句話說,下面的程式碼段:
promise
.finally(() => {
    «statements»
});
複製程式碼

等價於:

promise
.then(
    result => {
        «statements»
        return result;
    },
    error => {
        «statements»
        throw error;
    }
);
複製程式碼

使用案例

最常見的使用案例類似於同步的 finally 分句:處理完某個資源後做些清理工作。不管有沒有報錯,這樣的工作都是有必要的。 舉個例子:

let connection;
db.open()
.then(conn => {
    connection = conn;
    return connection.select({ name: 'Jane' });
})
.then(result => {
    // Process result
    // Use `connection` to make more queries
})
···
.catch(error => {
    // handle errors
})
.finally(() => {
    connection.close();
});
複製程式碼

.finally() 類似於同步程式碼中的 finally {}

同步程式碼裡,try 語句分為三部分:try 分句,catch 分句和 finally 分句。 對比 Promise:

  • try 分句相當於呼叫一個基於 Promise 的函式或者 .then() 方法
  • catch 分句相當於 Promise 的 .catch() 方法
  • finally 分句相當於提案在 Promise 新引入的 .finally() 方法

然而,finally {} 可以 return 和 throw ,而在.finally() 回撥裡只能 throw, return 不起任何作用。這是因為這個方法不能區分顯式返回和正常結束的回撥。

可用性

深入閱讀


原文:http://exploringjs.com/es2018-es2019/ch_promise-prototype-finally.html

相關文章