Promise 静态方法 all、race、any、allSettled的使用

前言

6个任务方法

function resolve1 () {
      return new Promise((resolve) => {
        setTimeout(() => {
          resolve('resolve1')
        }, 1000)
      })
    }
    function resolve2 () {
      return new Promise((resolve) => {
        setTimeout(() => {
          resolve('resolve2')
        }, 2000)
      })
    }
    function resolve3 () {
      return new Promise((resolve) => {
        setTimeout(() => {
          resolve('resolve3')
        }, 3000)
      })
    }
    function reject1 () {
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          reject('reject1')
        }, 1000)
      })
    }
    function reject2 () {
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          reject('reject2')
        }, 2000)
      })
    }
    function reject3 () {
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          reject('reject3')
        }, 3000)
      })
    }

1、Promise.all()

结论:当所有Promise任务是resolve结果才是resolve--也就是执行then里面的回调,只要有一个任务reject则就会执行catch里面的回调,执行时间是所有任务中执行时间最长的那个任务所对应的时间

代码

 // 测试Promise.all([])、全部成功
    Promise.all([resolve1(), resolve2(), resolve3()]).then((res) => {
      console.log(res)
    }).catch((err) => {
      console.log(err)
    })
    // 测试Promise.all([])、有出错的
    Promise.all([resolve1(), reject1(), resolve3()]).then((res) => {
      console.log('then', res)
    }).catch((err) => {
      console.log('err', err)
    })
    Promise.all([resolve1(), reject2(), resolve3()]).then((res) => {
      console.log('then', res)
    }).catch((err) => {
      console.log('err', err)
    })
    Promise.all([resolve1(), reject2(), reject3()]).then((res) => {
      console.log('then', res)
    }).catch((err) => {
      console.log('err', err)
    })

 

2、Promise.race()

执行结果就是最先改变状态的promise任务的状态,无论是resolve还是reject,那个先改变状态,整个任务的执行时间就是对应的那个成功任务所对应的时间

 代码

// race 最先改变状态的
    Promise.race([resolve1(), resolve2(), resolve3()]).then((res) => {
      console.log('then', res)
    }).catch((err) => {
      console.log('err', err)
    })
    Promise.race([reject1(), resolve2(), resolve3()]).then((res) => {
      console.log('then', res)
    }).catch((err) => {
      console.log('err', err)
    })
    Promise.race([resolve1(), reject2(), resolve3()]).then((res) => {
      console.log('then', res)
    }).catch((err) => {
      console.log('err', err)
    })

3、Promise.any()

捕获任意一个先成功执行的Promise任务,那个先成功,整个任务的执行时间就是对应的那个成功任务所对应的时间

代码

Promise.any([resolve1(), reject1(), resolve3()]).then((res) => {
      console.log('then', res)
    }).catch((err) => {
      console.log('err', err)
    })
    Promise.any([reject1(), reject2(), resolve3()]).then((res) => {
      console.log('then', res)
    }).catch((err) => {
      console.log('err', err)
    })
    Promise.any([reject1(), reject2(), reject3()]).then((res) => {
      console.log('then', res)
    }).catch((err) => {
      console.log('err', err)
    })

 

4、Promise.allSettled()

 代码

/** Promise.allSettled捕获所有任务的执行结果 */
    Promise.allSettled([resolve1(), reject1(), resolve3()]).then((res) => {
      console.log('then', res)
    })
    Promise.allSettled([reject1(), reject2(), resolve3()]).then((res) => {
      console.log('then', res)
    })
    Promise.allSettled([reject1(), reject2(), reject3()]).then((res) => {
      console.log('then', res)
    })

完整测试代码

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Promise静态方法的使用</title>
</head>

<body>
  <script>
    /**
     * Promise.all([promise1, promise2,promise3...])当多个promise任务不相互依赖的时候,同时执行,
     * 就可以使用all方法执行,然后等待所有任务执行完毕、在处理全部结果,当全部为resolved结果才是成功,否则
     * 一旦出现rejected则结果就是执行失败
     * 
     * Promise.race([promise1, promise2,promise3...])
     * 当多个不相互依赖的promise任务同时执行,最先改变状态的结果就是最终的结果
     * 
     * Promise.allSottled([promise1, promise2,promise3...])
     * 
     * Promise.any([promise1, promise2,promise3...])
     * 类似race但是,只会获取resolved结果,除非全部是rejected,结果才是rejected
     */
    function resolve1 () {
      return new Promise((resolve) => {
        setTimeout(() => {
          resolve('resolve1')
        }, 1000)
      })
    }
    function resolve2 () {
      return new Promise((resolve) => {
        setTimeout(() => {
          resolve('resolve2')
        }, 2000)
      })
    }
    function resolve3 () {
      return new Promise((resolve) => {
        setTimeout(() => {
          resolve('resolve3')
        }, 3000)
      })
    }
    function reject1 () {
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          reject('reject1')
        }, 1000)
      })
    }
    function reject2 () {
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          reject('reject2')
        }, 2000)
      })
    }
    function reject3 () {
      return new Promise((resolve, reject) => {
        setTimeout(() => {
          reject('reject3')
        }, 3000)
      })
    }

    /** 测试Promise.all([])、全部成功 */
    // Promise.all([resolve1(), resolve2(), resolve3()]).then((res) => {
    //   console.log(res)
    // }).catch((err) => {
    //   console.log(err)
    // })
    // // 测试Promise.all([])、有出错的
    // Promise.all([resolve1(), reject1(), resolve3()]).then((res) => {
    //   console.log('then', res)
    // }).catch((err) => {
    //   console.log('err', err)
    // })
    // Promise.all([resolve1(), reject2(), resolve3()]).then((res) => {
    //   console.log('then', res)
    // }).catch((err) => {
    //   console.log('err', err)
    // })
    // Promise.all([resolve1(), reject2(), reject3()]).then((res) => {
    //   console.log('then', res)
    // }).catch((err) => {
    //   console.log('err', err)
    // })

    /** race 最先改变状态的 */
    // Promise.race([resolve1(), resolve2(), resolve3()]).then((res) => {
    //   console.log('then', res)
    // }).catch((err) => {
    //   console.log('err', err)
    // })
    // Promise.race([reject1(), resolve2(), resolve3()]).then((res) => {
    //   console.log('then', res)
    // }).catch((err) => {
    //   console.log('err', err)
    // })
    // Promise.race([resolve1(), reject2(), resolve3()]).then((res) => {
    //   console.log('then', res)
    // }).catch((err) => {
    //   console.log('err', err)
    // })

    /** Promise.any 那个先成功结果就是那个,全部为reject结果才是reject*/
    // Promise.any([resolve1(), reject1(), resolve3()]).then((res) => {
    //   console.log('then', res)
    // }).catch((err) => {
    //   console.log('err', err)
    // })
    // Promise.any([reject1(), reject2(), resolve3()]).then((res) => {
    //   console.log('then', res)
    // }).catch((err) => {
    //   console.log('err', err)
    // })
    // Promise.any([reject1(), reject2(), reject3()]).then((res) => {
    //   console.log('then', res)
    // }).catch((err) => {
    //   console.log('err', err)
    // })

    /** Promise.allSettled捕获所有任务的执行结果 */
    Promise.allSettled([resolve1(), reject1(), resolve3()]).then((res) => {
      console.log('then', res)
    })
    Promise.allSettled([reject1(), reject2(), resolve3()]).then((res) => {
      console.log('then', res)
    })
    Promise.allSettled([reject1(), reject2(), reject3()]).then((res) => {
      console.log('then', res)
    })
  </script>
</body>

</html>

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Promise.all和Promise.allSettled是两种不同的Promise方法,它们在使用场景和返回结果上有所不同。 1. Promise.all: - 使用场景:当需要等待多个Promise对象都完成后再执行后续操作时,可以使用Promise.all。 - 返回结果:返回一个新的Promise对象,Promise对象在所有给定的Promise对象都已经fulfilled后才会fulfilled,如果其中任何一个Promise对象被rejected,则返回的Promise对象会立即被rejected。 - 示例代码: ```javascript const promise1 = Promise.resolve(1); const promise2 = Promise.resolve(2); const promise3 = Promise.resolve(3); Promise.all([promise1, promise2, promise3]) .then(values => { console.log(values); // 输出:[1, 2, 3] }) .catch(error => { console.log(error); // 如果有任何一个Promise对象被rejected,则会执行这里的代码 }); ``` 2. Promise.allSettled: - 使用场景:当需要等待多个Promise对象都完成后,无论是fulfilled还是rejected,都需要获取每个Promise对象的结果时,可以使用Promise.allSettled。 - 返回结果:返回一个新的Promise对象,该Promise对象在所有给定的Promise对象都已经fulfilled或rejected后才会fulfilled,返回的Promise对象带有一个对象数组,每个对象表示对应的Promise对象的结果,包括状态(fulfilled或rejected)和值。 - 示例代码: ```javascript const apiOne = function(id) { return new Promise((resolve, reject) => { resolve({ result: true, text: 1 }); }); }; const apiTwo = function(id) { return new Promise((resolve, reject) => { reject({ result: true, text: 2 }); }); }; Promise.allSettled([apiOne('one'), apiTwo('two')]) .then(results => { console.log(results); /* 输出: [ { status: 'fulfilled', value: { result: true, text: 1 } }, { status: 'rejected', reason: { result: true, text: 2 } } ] */ }) .catch(error => { console.log(error); }); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值