zoukankan      html  css  js  c++  java
  • Promise的几个重要api

    Promise.resolve 

    • Promise.resolve(value) 方法返回一个以给定值解析后的Promise 对象。

    • 如果这个值是一个 promise ,那么将返回这个 promise ;

    • 如果这个值是thenable(即带有"then" 方法),返回的promise会“跟随”这个thenable的对象,采用它的最终状态;否则返回的promise将以此值完成。


    // 1. 非Promise对象,非thenable对象
    Promise.resolve(1).then(console.log) // 1
    
    // 2. Promise对象成功状态
    const p2 = new Promise((resolve) => resolve(2))
    
    Promise.resolve(p2).then(console.log) // 2
    
    // 3. Promise对象失败状态
    const p3 = new Promise((_, reject) => reject('err3'))
    
    Promise.resolve(p3).catch(console.error) // err3
    
    // 4. thenable对象
    const p4 = {
      then (resolve) {
        setTimeout(() => resolve(4), 1000)
      }
    }
    Promise.resolve(p4).then(console.log) // 4
    
    // 5. 啥都没传
    Promise.resolve().then(console.log) // undefined

    Promise.reject

     Promise.reject() 方法返回一个带有拒绝原因的Promise对象。

    Promise.reject(new Error('fail'))
      .then(() => console.log('Resolved'), 
            (err) => console.log('Rejected', err))
    // 输出以下内容        
    // Rejected Error: fail
    //    at <anonymous>:2:16        

    Promise.all

    Promise.all()方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。这个静态方法应该是面试中最常见的啦

    const p = Promise.all([p1, p2, p3])

    最终p的状态由p1p2p3决定,分成两种情况。

    (1)只有p1p2p3的状态都变成fulfilledp的状态才会变成fulfilled,此时p1p2p3的返回值组成一个数组,传递给p的回调函数。

    (2)只要p1p2p3之中有一个被rejectedp的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。

    const p1 = Promise.resolve(1)
    const p2 = new Promise((resolve) => {
      setTimeout(() => resolve(2), 1000)
    })
    const p3 = new Promise((resolve) => {
      setTimeout(() => resolve(3), 3000)
    })
    
    const p4 = Promise.reject('err4')
    const p5 = Promise.reject('err5')
    // 1. 所有的Promise都成功了
    const p11 = Promise.all([ p1, p2, p3 ])
        .then(console.log) // [ 1, 2, 3 ]
          .catch(console.log)
          
    // 2. 有一个Promise失败了
    const p12 = Promise.all([ p1, p2, p4 ])
        .then(console.log)
          .catch(console.log) // err4
          
    // 3. 有两个Promise失败了,可以看到最终输出的是err4,第一个失败的返回值
    const p13 = Promise.all([ p1, p4, p5 ])
        .then(console.log)
          .catch(console.log) // err4

    Promise.allSettled

    有时候,我们希望等到一组异步操作都结束了,不管每一个操作是成功还是失败,再进行下一步操作。显然Promise.all(其只要是一个失败了,结果即进入失败状态)不太适合,所以有了Promise.allSettled

    Promise.allSettled()方法接受一个数组作为参数,数组的每个成员都是一个 Promise 对象,并返回一个新的 Promise 对象。只有等到参数数组的所有 Promise 对象都发生状态变更(不管是fulfilled还是rejected),返回的 Promise 对象才会发生状态变更,一旦发生状态变更,状态总是fulfilled,不会变成rejected

    还是以上面的例子为例, 我们看看与Promise.all有什么不同

    const p1 = Promise.resolve(1)
    const p2 = new Promise((resolve) => {
      setTimeout(() => resolve(2), 1000)
    })
    const p3 = new Promise((resolve) => {
      setTimeout(() => resolve(3), 3000)
    })
    
    const p4 = Promise.reject('err4')
    const p5 = Promise.reject('err5')
    // 1. 所有的Promise都成功了
    const p11 = Promise.allSettled([ p1, p2, p3 ])
        .then((res) => console.log(JSON.stringify(res, null,  2)))
    
    // 输出 
    /*
    [
      {
        "status": "fulfilled",
        "value": 1
      },
      {
        "status": "fulfilled",
        "value": 2
      },
      {
        "status": "fulfilled",
        "value": 3
      }
    ]
    */
          
    // 2. 有一个Promise失败了
    const p12 = Promise.allSettled([ p1, p2, p4 ])
        .then((res) => console.log(JSON.stringify(res, null,  2)))
            
    // 输出 
    /*
    [
      {
        "status": "fulfilled",
        "value": 1
      },
      {
        "status": "fulfilled",
        "value": 2
      },
      {
        "status": "rejected",
        "reason": "err4"
      }
    ]
    */
          
    // 3. 有两个Promise失败了
    const p13 = Promise.allSettled([ p1, p4, p5 ])
        .then((res) => console.log(JSON.stringify(res, null,  2)))
            
    // 输出 
    /*
    [
      {
        "status": "fulfilled",
        "value": 1
      },
      {
        "status": "rejected",
        "reason": "err4"
      },
      {
        "status": "rejected",
        "reason": "err5"
      }
    ]
    */

    Promise.race

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

    const p = Promise.race([p1, p2, p3])

    只要p1p2p3之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给p的回调函数。

    const p1 = new Promise((resolve, reject) => {
      setTimeout(resolve, 500, 1)
    })
    
    const p2 = new Promise((resolve, reject) => {
      setTimeout(resolve, 100, 2)
    })
    
    Promise.race([p1, p2]).then((value) => {
      console.log(value) // 2
    })
    
    Promise.race([p1, p2, 3]).then((value) => {
      console.log(value) // 3
    })
  • 相关阅读:
    Spring之Redis访问(Spring-data-redis)
    SpringCloud之Hystrix容错保护原理及配置
    SpringCloud之Feign声明式调用原理及配置
    SpringCloud之Ribbon负载均衡配置
    基于Zookeeper实现分布式锁
    SpringCloud之Eureka注册中心原理及其搭建
    SpringBoot定时任务(schedule、quartz)
    Java和操作系统交互(Java 代码是怎么执行)(转)
    深入SpringBoot注解原理及使用
    Spring事务的配置、参数详情及其原理介绍(Transactional)
  • 原文地址:https://www.cnblogs.com/magicg/p/15785079.html
Copyright © 2011-2022 走看看