Promise.all(只要失败一个就不会走then)的解决方案

因为我们经常会使用到接口的重复调用问题或链式调用接口

  1. Promise.all 很舒服的解决了这些问题

但是Promise.all的特性 是会执行里面的所有异步操作,遇到抛错就取消执行,并不会继续往下执行了。
有时我们 需要能继续执行下去。这样也是有方法能实现的…

    // 代码 解决:在catch里面resolve就行了
    // 测试了下 解决方式还能实现
    var p1 = new Promise(resolve => {
        let p1Data = b;
        resolve(p1Data)
    }).catch(err => {
        return Promise.resolve("P1 无数据")
    })

    var p2 = new Promise(resolve => {
        let p2Data = 'p2的有数据';
        resolve(p2Data)
    }).catch(err => {
        return Promise.resolve("P2 无数据")
    })

    Promise.all([p1, p2]).then(res => {
        console.log(res);
    }).catch(err => {
        throw new Error("Promise 执行错误", err)
    })

执行结果
在这里插入图片描述这样就不会 出错就不往下执行啦

感谢参考此博客 嘻嘻嘻

  1. Promise.race的使用

Promse.race 特性就是赛跑的意思,意思就是说,Promise.race([p1, p2, p3])里面哪个结果获得的快,就返回那个结果,不管结果本身是成功状态还是失败状态。

  let p1 = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('success')
  },1000)
})

let p2 = new Promise((resolve, reject) => {
  setTimeout(() => {
    reject('failed')
  }, 500)
})

Promise.race([p1, p2]).then((result) => {
  console.log(result)
}).catch((error) => {
  console.log(error)     // 打开的是 'failed'
})

所以这个还是挺好理解,不管成功或失败,只返回第一个执行结束的

  • 7
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然,我非常愿意帮助你手写一个 Promise.all() 函数。 首先,我们需要了解 Promise.all() 函数的作用。它可以接受多个 Promise 对象作为参数,并在这些 Promise 对象都被 fulfilled(已完成)时才返回一个 resolved(已解决)状态的 Promise 对象,如果其中任何一个 Promise 被 rejected(已拒绝),则该 Promise 返回的状态也为 rejected(已拒绝)。 现在,让我们手写一个简单的 Promise.all() 函数: ```javascript function promiseAll(promises) { return new Promise(function(resolve, reject) { if (!Array.isArray(promises)) { return reject(new TypeError('参数必须为数组')); } var resolvedCounter = 0; var promiseNum = promises.length; var resolvedValues = new Array(promiseNum); for (var i = 0; i < promiseNum; i++) { (function(i) { Promise.resolve(promises[i]).then(function(value) { resolvedCounter++; resolvedValues[i] = value; if (resolvedCounter == promiseNum) { return resolve(resolvedValues); } }).catch(function(reason) { return reject(reason); }); })(i); } }); } ``` 在这个函数中,我们首先检查传递的参数是否为数组。如果不是,则返回一个 rejected(已拒绝)状态的 Promise 对象,并抛出一个类型错误。然后,我们使用一个 for 循环迭代数组中的所有 Promise 对象。由于对于每个 Promise 对象都需要进行异步操作,因此我们使用了一个自执行函数,并传递 i 作为参数。这样可以确保每个 Promise 对象都在自己的闭包中执行,而不是在全局作用域中执行。 接下来,我们使用 Promise.resolve() 将 promise 对象转换为 Promise 对象。然后,我们分别使用 then() 和 catch() 方法处理 resolved 和 rejected 状态。 在 then() 方法中,我们将该 Promise 的 resolved 值存储在 resolvedValues 数组中,并检查是否已解决了所有 Promise 对象。如果是,则返回一个 resolved(已解决)状态的 Promise 对象,并传递解析的值。如果所有 Promise 对象都已解决,则 resolvedValues 数组包含所有解决方案,而 resolvedCounter 等于 promiseNum。 在 catch() 方法中,我们直接返回一个 rejected(已拒绝)状态的 Promise 对象,并传递 rejection 原因。 现在,您已经了解了如何手写一个 Promise.all() 函数。祝你好运!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值