前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >每天3分钟,重学ES6-ES12(十一)Promise的类方法

每天3分钟,重学ES6-ES12(十一)Promise的类方法

作者头像
虎妞先生
发布2022-09-19 14:20:26
2070
发布2022-09-19 14:20:26
举报
文章被收录于专栏:前端开疆扩土之路

theme: juejin

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第23天,点击查看活动详情

每天3分钟,重学ES6-ES12文章汇总

前言

今天开始和大家一起系统的学习ES6+,每天3分钟,用一把斗地主的时间,重学ES6+,前面我们学习的then、catch、finally方法都属于Promise的实例方法,都是存放在Promise的prototype上的。 下面我们再来学习一下Promise的类方法。

resolve方法

  • 有时候我们已经有一个现成的内容了,希望将其转成Promise来使用,这个时候我们可以使用 Promise.resolve 方法来完成。
  • Promise.resolve的用法相当于new Promise,并且执行resolve操作: Promise.resolve('a')

等价于

new Promise((resolve)=>resolve('a'))

  • resolve参数的形态:
    • 情况一:参数是一个普通的值或者对象
    • 情况二:参数本身是Promise
    • 情况三:参数是一个thenable

reject方法

  • reject方法类似于resolve方法,只是会将Promise对象的状态设置为reject状态。
  • Promise.reject的用法相当于new Promise,只是会调用reject: Promise.reject('a')

等价于

new Promise((resolve,rejext)=>reject('a'))

  • Promise.reject传入的参数无论是什么形态,都会直接作为reject状态的参数传递到catch的。

all方法

  • 它的作用是将多个Promise包裹在一起形成一个新的Promise;
  • 新的Promise状态由包裹的所有Promise共同决定:
    • 当所有的Promise状态变成fulfilled状态时,新的Promise状态为fulfilled,并且会将所有Promise的返回值 组成一个数组;
    • 当有一个Promise状态为reject时,新的Promise状态为reject,并且会将第一个reject的返回值作为参数;

allSettled方法

  • all方法有一个缺陷:当有其中一个Promise变成reject状态时,新Promise就会立即变成对应的reject状态。
    • 那么对于resolved的,以及依然处于pending状态的Promise,我们是获取不到对应的结果的;
  • ES11(ES2020)中,添加了新的API Promise.allSettled:
    • 该方法会在所有的Promise都有结果(settled),无论是fulfilled,还是reject时,才会有最终的状态;
    • 并且这个Promise的结果一定是fulfilled的;
  • allSettled的结果是一个数组,数组中存放着每一个Promise的结果,并且是对应一个对象的;
    • 这个对象中包含status状态,以及对应的value值;代码演示 ```js // 创建多个Promise const p1 = new Promise((resolve, reject) => { setTimeout(() => { resolve(11111) }, 1000); })

const p2 = new Promise((resolve, reject) => { setTimeout(() => { reject(22222) }, 2000); })

const p3 = new Promise((resolve, reject) => { setTimeout(() => { resolve(33333) }, 3000); })

// allSettled Promise.allSettled([p1, p2, p3]).then(res => { console.log(res) }).catch(err => { console.log(err) }) //[{status: 'fulfilled', value: 11111},  //{status: 'rejected', reason: 22222}, //{status: 'fulfilled', value: 33333}]

代码语言:javascript
复制
# race方法
* 如果有一个Promise有了结果,我们就希望决定最终新Promise的状态,那么可以使用race方法: 

    * race是竞技、竞赛的意思,表示多个Promise相互竞争,谁先有结果,那么就使用谁的结果;

# any方法
* any方法是`ES12`中新增的方法,和race方法是类似的:

    * any方法会等到一个fulfilled状态,才会决定新Promise的状态;
    
    * 如果所有的Promise都是reject的,那么也会等到所有的Promise都变成rejected状态;
    
    * 如果所有的Promise都是reject的,那么会报一个AggregateError的错误。
    
# 总结
Promise在面试中,属于经常会问的知识,但是很少让手写promise的原理,因为时间不允许,但是手写promise源码是最能考察基本功的,所以大多是面试题都变成了,考察promsie的类方法,手写一个类方法的实现。之后有精力也会和大家分享类方法的实现。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-06-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • theme: juejin
  • 前言
  • resolve方法
  • reject方法
  • all方法
  • allSettled方法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档