关于promise.all和promise.allSettled

298 阅读2分钟

前言

这两个promise的运用,对于前端同学来说应该是不陌生的,那我为啥还要写一下关于这俩的文章呢?因为我总是记不住两者的异同点,导致我每次遇到这样的场景,都需要去度娘一下,暴风哭泣~

简单介绍一下

promise.all():

该方法将一组可迭代的Promises作为输入,在日常的使用中,也就是将多个Promise组成的数组作为该方法的参数,然后这个方法最终只会返回一个Promise实例。

这个Promise实例的resolve回调的结果也是一个数组,这个数组是作为参数的Promise集合的resolve回调的数组集合所组成的,执行的时机是在所有输入的promise的resolve回调都执行结束后,或者输入的集合中没有了promise的时候,也就是说,输入的promise都已经是fulfilled状态了。

除此之外,有resolve的状态,自然也会有reject的时候。当输入的promise集合中,只要有一个promise被rejected,那promise.all()的状态就会变为rejected,但是此时rejected回调的结果不是一个数组,而是只有promise集合中第一个被rejected的promise的返回值

promise.all()的.then()方法会执行promise.all()的成功回调,.catch()方法会执行promise.all()的失败回调,或者,使用es6的语法,async/await结合try catch来使用(我也没试过这样行不行,滑稽~)

promise.allSettled()

上面介绍了promise.all(),这个方法在出现一个失败的时候,后面的promise实例就不会再继续进行了,直接返回错误的promise实例的rejected结果,但是有时候,我们也需要让后面的promise实例能继续进行。

该方法接收的参数和promise.all()是一样的,不一样的地方在于,promise.allSettled()不管是fulfilled还是rejected,都会返回所有promise实例的结果,同是返回的结果是一个描述所有promise实例状态结果的数组。

使用场景

有多个彼此不依赖的异步任务成功完成时,或者您总是想知道每个promise的结果时,通常使用promise.allSettled()

相比之下,promise.all() 更适合彼此相互依赖或者在其中任何一个reject时立即结束。