面试:Promise.all 绕过 reject

317 阅读1分钟

面试官:循环请求接口,过程中有一个报错,不中断,先全部请求完,最后返回是哪个报错提示给用户。

Promise.all 一个报错绕过reject,先全部返回,后处理

可被链式调用

image.png

构造函数 Promise()

创建一个新的 Promise 对象。

静态方法

Promise.all(iterable)

原则上Promise.all只要一个reject了全员不过,为了解决这个问题: 下面是先让过,后面再提示,例子如下:

Promise.all() 方法接收一个promise的iterable类型(注:Array,Map,Set都属于ES6的iterable类型)的输入,并且只返回一个Promise实例, 那个输入的所有promise的resolve回调的结果是一个数组。这个Promise的resolve回调执行是在所有输入的promise的resolve回调都结束,或者输入的iterable里没有promise了的时候。它的reject回调执行是,只要任何一个输入的promise的reject回调执行或者输入不合法的promise就会立即抛出错误,并且reject的是第一个抛出的错误信息。

const arr = [1, 2, 3]

promiseArr () {
    return arr.map(v => {
        return new Promise((resolve, reject) => {
             setTimeout(() => {
                 if (v % 2 === 0) {
                     resolve(v)
                 } else {
                     reject('err' + v)
                 }
             }, 1000)
        })
    })
}

Promise.all(promiseArr.map(v => v.catch(e => {})))
    .then(res => {
        // 这里res 会返回 [err1, 2, err3]
    }
    .catch(() => {})