请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

通过race获取资源的疑问

通过race可以实现资源竞争获取,取多个Promise最先改变状态返回的结果,但是如果其中一个最先改变状态,但是状态变为了rejected,那么race的状态也会变为rejected,请问是不是就获取不到资源了,我这边写了一个demo,现实只会获取最先改变状态的错误信息,不会获取后面promise正确返回的结果

function promise1 (a) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if (a > 0) {
        resolve(a)
      } else {
        // eslint-disable-next-line prefer-promise-reject-errors
        reject('错误')
      }
    }, 3000)
  })
}
function promise2 (a) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      if (a < 0) {
        resolve(a)
      } else {
        // eslint-disable-next-line prefer-promise-reject-errors
        reject('错误')
      }
    }, 2000)
  })
}
let race = Promise.race(promise1(2), promise2(2)).then(res => {
  console.log(res, 'res')
}).catch(err => {
  console.log(err, '错误了')
})

输出错误信息,并不能获取peomise返回的2,因此还可以用于同一资源多处获取吗,这是我的疑问,求解答,谢谢!
图片描述

正在回答 回答被采纳积分+3

1回答

快乐动起来呀 2020-03-13 22:35:45

其实不能这么理解,正常情况两个资源只有快慢之分,而且就算异常,按照浏览器的超时设置也会大于资源响应,除非两个资源A异常,B正常但返回时间大于A的超时设置

0 回复 有任何疑惑可以回复我~
  • 提问者 qq_慕侠0094731 #1
    老师,这个是现实业务中从不同地方同时获取资源的常用的处理方式吗,因为还是毕竟存在较小的风险,有没有更好的处理方式呢
    回复 有任何疑惑可以回复我~ 2020-03-13 23:04:01
  • 快乐动起来呀 回复 提问者 qq_慕侠0094731 #2
    那就是在race的catch里增加兜底方案
    回复 有任何疑惑可以回复我~ 2020-03-13 23:08:23
  • 提问者 qq_慕侠0094731 回复 快乐动起来呀 #3
    懂了,谢谢老师!
    回复 有任何疑惑可以回复我~ 2020-03-13 23:26:18
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信