Jordan Harband 提出了 Promise.prototype.finally
這一章節的提案。html
.finally() 這樣用:git
promise
.then(result => {···})
.catch(error => {···})
.finally(() => {···});
複製代碼
finally 的回調老是會被執行。做爲比較:es6
promise
.finally(() => {
«statements»
});
複製代碼
等價於:github
promise
.then(
result => {
«statements»
return result;
},
error => {
«statements»
throw error;
}
);
複製代碼
最多見的使用案例相似於同步的 finally 分句:處理完某個資源後作些清理工做。無論有沒有報錯,這樣的工做都是有必要的。 舉個例子:npm
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();
});
複製代碼
同步代碼裏,try 語句分爲三部分:try 分句,catch 分句和 finally 分句。 對比 Promise:promise
然而,finally {} 能夠 return 和 throw ,而在.finally() 回調裏只能 throw, return 不起任何做用。這是由於這個方法不能區分顯式返回和正常結束的回調。bash
promise.prototype.finally
是 .finally() 的一個 polyfill原文:http://exploringjs.com/es2018-es2019/ch_promise-prototype-finally.htmlasync