给你一个promise数组,我需要并行执行,并且数组里面所有promise全部抛出错误之后,才抛出错误,该怎么做
今天面试,遇到如标题这么一个问题,真的给我问懵逼了,一开始想说使用promise.all,但是不行,因为promise.all只要有一个抛出错误了,整个promise.all就全部失败了。当时给我问的支支吾吾的打答不出来,并且还需要并行执行,想破头了都想不出来。后面回来重新学习ECMAScript才发现,使用一个API,promise.allSettled就可以了,下面我们一起学习学习promise.allSettled。
promise.allSettled和promise.all一样也是接受一个数组。不过它会等待数组里的所有promise全部都发生状态变更(不管是fulfiled还是rejected)后自己本身才发生状态变更。该方法返回的promise实例,状态总是fulfilled。
let allPromise = Promise.allSettled([Promise.resolve(42), Promise.resolve(-1)]).then(result => { console.log(resules) }) // [ // { status: 'fulfilled', value: 42 }, // { status: 'rejected', reason: -1 } // ]
如上,返回一个数组,数组里面包括每一个promise的状态status和值,如果成功就是value属性,如果失败就是reason属性。
其实还有个promise.any也可以实现,any和all刚好相反,它是只要有一个promise的状态变为fulfilled,整个返回的promise实例就都变成fulfilled了。只有当全部promise都rejected之后,整个promise实例才会rejected。所以我们可以在any的catch方法里面实现标题所述的问题。