美文网首页
Promise.finally、Promise.all、Prom

Promise.finally、Promise.all、Prom

作者: 浅浅_2d5a | 来源:发表于2021-08-03 17:50 被阅读0次

Promise原型对象上的方法


image.png

Promise构造函数中定义的方法


image.png
1. Promise.prototype.finally()

finally()方法用于指定不管 Promise 对象最后状态如何,都会执行的操作。该方法是 ES2018 引入标准的。

.then(result => {···})
.catch(error => {···})
.finally(() => {···}); //一定会走

finally方法的回调函数不接受任何参数,这意味着没有办法知道,前面的 Promise 状态到底是fulfilled还是rejected。这表明,finally方法里面的操作,应该是与状态无关的,不依赖于 Promise 的执行结果。

2. Promise.all()

Promise.all()方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。
const p = Promise.all([a、b、c]);
a、b、c都是 Promise 实例,如果不是,就会先调用下面讲到的Promise.resolve方法,将参数转为 Promise 实例,再进一步处理。
另外,Promise.all()方法的参数可以不是数组,但必须具有 Iterator 接口,且返回的每个成员都是 Promise 实例。

p的状态由a、b、c决定,分成两种情况。
(1)只有a、b、c的状态都变成fulfilled,p的状态才会变成fulfilled,此时a、b、c的返回值组成一个数组,传递给p的回调函数。

(2)只要a、b、c之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。
注意,如果作为参数的 Promise 实例,自己定义了catch方法,那么它一旦被rejected,并不会触发Promise.all()的catch方法。

    const a = new Promise((resolve,reject) => {
        console.log(1)
        resolve('结果1')
    })
    const b = new Promise((resolve,reject) => {
        console.log(2)
        reject('结果2')
    }).then().catch((err) => {
        console.log('bResult失败',err) //进来了
    })
    const c = new Promise((resolve,reject) => {
        console.log(3)
        resolve('结果3')
    })
    Promise.all([a,b,c]).then((res)=>{
        console.log(res)
    }).catch( err => {
        console.log('失败',err) //没打印
    })

b首先会rejected,但是b有自己的catch方法,该方法返回的是一个新的 Promise 实例,b指向的实际上是这个实例。该实例执行完catch方法后,也会变成resolved,导致Promise.all()方法参数里面的两个实例都会resolved,因此会调用then方法指定的回调函数,而不会调用catch方法指定的回调函数。
如果b没有自己的catch方法,就会调用Promise.all()的catch方法

3.Promise.race()方法同样是将多个 Promise 实例,包装成一个新的 Promise 实例。

const p = Promise.race([p1, p2, p3]);
上面代码中,只要p1、p2、p3之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给p的回调函数。

4.Promise.allSettled()

方法接受一组 Promise 实例作为参数,包装成一个新的 Promise 实例。只有等到所有这些参数实例都返回结果,不管是fulfilled还是rejected,包装实例才会结束
状态只可能变成fulfilled
使用场景:只关心这些操作有没有结束

5.Promise.any()

该方法接受一组 Promise 实例作为参数,包装成一个新的 Promise 实例返回。
只要参数实例有一个变成fulfilled状态,包装实例就会变成fulfilled状态;如果所有参数实例都变成rejected状态,包装实例就会变成rejected状态。
Promise.any()跟Promise.race()方法很像,只有一点不同,就是Promise.any()不会因为某个 Promise 变成rejected状态而结束,必须等到所有参数 Promise 变成rejected状态才会结束。

6.Promise.resolve()

有时需要将现有对象转为 Promise 对象,Promise.resolve()方法就起到这个作用
Promise.resolve('foo')
// 等价于
new Promise(resolve => resolve('foo'))

Promise.resolve()方法的参数分成四种情况

(1)参数是一个 Promise 实例
如果参数是 Promise 实例,那么Promise.resolve将不做任何修改、原封不动地返回这个实例。
(2)参数是一个thenable对象
thenable对象指的是具有then方法的对象,比如下面这个对象。

let thenable = {
  then: function(resolve, reject) {
    resolve(42);
  }
};

Promise.resolve()方法会将这个对象转为 Promise 对象,然后就立即执行thenable对象的then()方法
(3)参数不是具有then()方法的对象,或根本就不是对象:如果参数是一个原始值,或者是一个不具有then()方法的对象,则Promise.resolve()方法返回一个新的 Promise 对象,状态为resolved

(4)不带有任何参数
Promise.resolve()方法允许调用时不带参数,直接返回一个resolved状态的 Promise 对象。

7.Promise.reject()

Promise.reject(reason)方法也会返回一个新的 Promise 实例,该实例的状态为rejected。
const p = Promise.reject('出错了');
// 等同于
const p = new Promise((resolve, reject) => reject('出错了'))

相关文章

  • Promise.finally、Promise.all、Prom

    Promise原型对象上的方法 Promise构造函数中定义的方法 1. Promise.prototype.fi...

  • 一步步手写Promsie源码(二)

    Promise.all方法实现 Promise.resolve方法实现 Promise.finally方法实现 c...

  • 为原型添加方法

    手动添加数组方法 为promise添加实现方法 promise.finally promise.all promi...

  • es6:promise

    异步任务,请求服务器数据: 传入请求地址,调用 调用结果 等待多个promise:Promise.all(prom...

  • 知识储备

    Promise Promise.all promise1和promise2都成功才会调用success1 Prom...

  • promise相关

    promise promise.race promise.finally promise.catch

  • Prom

    我的博客:www.viggoz.com突然翻出来了这张照片,觉得和毕业季很配。拍摄日期显示2015年9月24号 已...

  • prom

    高中毕业是很多人人生中非常重要的节点,在中国我们通常会参加毕业典礼或者成人仪式,争取为自己留下一个美好的回忆。 而...

  • Promise.allSettled,ES2020新特性对于Pr

    Promise.all方法 使用promise.all如果有一个对象reject了,那么promise.all就会...

  • Docker初见(六)Docker 安装Prometheus和G

    本次安装Prometheus和Grafana版本如下: prom/node-exporter prom/prome...

网友评论

      本文标题:Promise.finally、Promise.all、Prom

      本文链接:https://www.haomeiwen.com/subject/cnsxvltx.html