为了账号安全,请及时绑定邮箱和手机立即绑定

promise对象的finally函数为什么要这样写

promise对象的finally函数为什么要这样写

慕村225694 2018-12-20 18:15:07
以下原版Promise.prototype.finally = function (callback) {      let P = this.constructor;     return this.then(function(value) {         P.resolve(callback()).then(function(){             return value;         });     },      function (reson) {         P.resolve(callback()).then(function() {             throw reason;         });     }); };为什么不能这样写Promise.prototype.finally = function (callback) {      let P = this.constructor;     return this.then(function(value) {         callback();         return value;     },      function (reson) {         callback();         throw reason;     }); };
查看完整描述

1 回答

?
智慧大石

TA贡献1946条经验 获得超3个赞

首先function (reson) {这里有点小错误,应该是reason.

然后,原版的代码也不是这样的吧。

这个是ES6语法下的。


Promise.prototype.finally = function (callback) {

  let P = this.constructor;

  return this.then(

    value  => P.resolve(callback()).then(() => value),

    reason => P.resolve(callback()).then(() => { throw reason })

  );

};

这个是转换为ES5之后的。


Promise.prototype.finally = function (callback) {

  var P = this.constructor;

  return this.then(function (value) {

    return P.resolve(callback()).then(function () {

      return value;

    });

  }, function (reason) {

    return P.resolve(callback()).then(function () {

      throw reason;

    });

  });

};

要这么写的原因是在于,finally其实并不一定是这个promise链的最后一环,相对而言,其实done才是。

因为finally可能之后还有then和catch等等,所以其必须要返回一个promise对象。

至于finally为何并不是promise的最后一环,我个人理解是在最开始讨论这个方法时候,是将其作为一段promise操作的结尾,例如多个继发的请求,在每个请求的最后进行finally操作。


查看完整回答
反对 回复 2019-01-27
  • 1 回答
  • 0 关注
  • 631 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信