专栏首页coding个人笔记Promise其它方法二

Promise其它方法二

race静态方法,只要有一个改变状态,不管成功失败都返回这个改变状态的值,如果是普通值之间成功返回:

static race(promises){
 return new Promise((resolve, reject) => {
  for(let i = 0; i < promises.length; i++){
   let current = promises[i];
   if(isPromise(current)){
    current.then(y => {
     resolve(y);
    }, r => {
     reject(r);
    })
   }else{
    resolve(current);
   }
  }
 })
}

finally方法,无论成功失败都会执行,而且都能继续执行then方法,下一个then方法的参数是上一个的参数,finally里面只是执行,如果先调用finally再调用then,那么finally里面返回promise的话会先等待promise执行完毕,如果放在最后面就无需等待:

Promise.resolve(100).then(res => {
 console.log(res);
}).finally(() => {
 console.log('finally');
 return new Promise((resolve, reject) => {
  setTimeout(() => {
   resolve(200);
  }, 2000);
 })
})
Promise.resolve(100).finally(() => {
 console.log('finally');
 return new Promise((resolve, reject) => {
  setTimeout(() => {
   resolve(200);
  }, 2000);
 })
}).then(res => {
 console.log(res);
})

其实finally就是调用then方法,跟catch很像

finally(callback){
 return this.then((value) => {
  callback();
  return value;
  }, (err) => {
  callback();
  throw err;
  });
}

无论成功失败都调用函数,只是这样就没有等待执行成功才往下走,所以我们给包一个promise:

finally(callback){
 return this.then((value) => {
   return Promise.resolve(callback()).then(() => value);
  }, (err) => {
   return Promise.resolve(callback()).then(() => {throw err});
  });
}

这样就等返回的promise执行完了才往下执行,这边要注意一点,参数是上一个参数传递给后面的方法,finally里面的结果是不会传递的。

Promise差不多就这样了,至于其它方法any、try等,用法我都没研究,觉着要是真的有兴趣可以去研究学一下。

最后就是测试了,因为能力有限,就是跑通了自己调用时候结果和原生对比,但是一些其它情况的处理是没做,而且去跑那个测试,新加了这些方法反而报了一些错,还是当作学习就好了,不要求完整复现原生Promise。

(完)

本文分享自微信公众号 - coding个人笔记(gh_2ce38b49dae1),作者:wade

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-03-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Promise其它方法一

    这个是最简单的,catch其实就是没有成功方法resolve的then函数,所以catch方法:

    wade
  • ES6之Promise对象

    Promise对象其实就是解决异步用的,比回调函数和事件更合理更强大,由ES6写进语言标准,统一了用法,然后提供了原生Promise对象。

    wade
  • Promise的几个方法

    我们都会觉得虽然是链式调用,对比回调会清晰一点,但是并没有想象中的那么美好。所以Promise提供了几个方法。

    wade
  • 算法学习笔记(五):快速排序和简单选择排序

    free赖权华
  • 零基础学习前端方向还是后端方向呢

    随着信息产业的迅猛发展,IT行业人才需求量也在逐年扩大。其中“软件开发”、“网络工程”等人才的缺口最为突出。以软件开发为例,我国软件人才需求以每年递增20%的速...

    千锋哈尔滨IT培训
  • mysql操作命令梳理(4)-grant授权和revoke回收权限

    在mysql维护工作中,做好权限管理是一个很重要的环节。下面对mysql权限操作进行梳理: mysql的权限命令是grant,权限撤销的命令时revoke; g...

    洗尽了浮华
  • 在MATLAB中RSA加密

    [Modulus, PublicExponent, PrivateExponent] = GenerateKeyPair;

    万木逢春
  • 白话网络编排(MANO),给你感兴趣的项目

    网络功能虚拟化(NFV)提供了一种设计、部署和管理网络服务的全新方式,NFV将网络功能如网络地址转换(NAT)、防火墙、入侵检测、域名服务和缓存等功能从专有硬件...

    SDNLAB
  • 白话网络编排(MANO),给你感兴趣的项目

    网络功能虚拟化(NFV)提供了一种设计、部署和管理网络服务的全新方式,NFV将网络功能如网络地址转换(NAT)、防火墙、入侵检测、域名服务和缓存等功能从专有硬件...

    SDNLAB
  • 上传代码之后,有的时候需要清除浏览器的缓存才能看到修改的效果

    上传代码之后,有的时候需要清除浏览器的缓存才能看到修改的效果,那么用户他们如果没有清除浏览器缓存,那我们的更新岂不是没用了,下面有几行html代码应该可以解决这...

    NateHuang

扫码关注云+社区

领取腾讯云代金券