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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值