axios.全部传播和全部捕获

uwopmtnx  于 2022-11-29  发布在  iOS
关注(0)|答案(3)|浏览(112)

我正在使用流行库'axios'的.all方法来处理我的ajax请求。
但是,如果所有请求都得到404,我如何处理错误?
例如:

axios.all([
        axios.get('http://some_url'),
        axios.get('http://another_url'),
      ])
        .then(axios.spread((someUrl, anotherUrl) => {
         // ... boring stuff goes there
        }))
        .catch(() => {
         //... error goes there
        });

因此,似乎只有一个错误被“抓住”了。
我怎么才能把他们都抓起来?或者有什么办法?

sc4hvdpw

sc4hvdpw1#

问题是(正如您已经知道的),一旦第一个promise被拒绝,您就会进入catch块,这使得无法在同一个catch中收集所有失败的响应。但是,您仍然可以手动处理失败的promise,以聚合错误,然后抛出。
检查它这将为您工作:

const promises = [
  axios.get('http://some_url'),
  axios.get('http://another_url'),
]
const promisesResolved = promises.map(promise => promise.catch(error => ({ error })))

function checkFailed (then) {
  return function (responses) {
    const someFailed = responses.some(response => response.error)

    if (someFailed) {
      throw responses
    }

    return then(responses)
  }
}

axios.all(promisesResolved)
  .then(checkFailed(([someUrl, anotherUrl]) => {
    console.log('SUCCESS', someUrl, anotherUrl)
  }))
  .catch((err) => {
    console.log('FAIL', err)
  });

如果至少有一个承诺失败,你就会进入catch块。你可以通过检查err数组的响应来找到一个。

envsm3lx

envsm3lx2#

我认为这是不可能的,因为Promise.all的快速失败行为。如果您的任何请求失败,它们将自动成为捕获的罪魁祸首和结果。

Promise.all([
      Promise.reject(Error('1')),
      Promise.reject(Error('2')),
      Promise.reject(Error('3'))
    ]).then((results) => {
      console.log(results)
    }, (error) => {
      console.log(error.message)
    })

这个结果代码总是打印1,因为它是第一个失败的。我认为一个类似的功能是要求在回购,他们说这是不可能的。
我本来想把这个作为一个评论,但还没有一个足够高的声誉。

aamkag61

aamkag613#

来自@dfsq的解决方案对我不起作用,因为当一个请求出错时,它会抛出所有请求。我修改了他的代码,这样每个请求要么得到解决,要么抛出一个错误。@dfsq请检查这个答案,如果代码正确的话,因为我是在你的解决方案上构建的。

const promises = [
  axios.get('http://some_url'),
  axios.get('http://another_url'),
]
const promisesResolved = promises.map(promise => promise.catch(error => ({ error })))

function checkFailed (then) {
    return function (responses) {
        responses.forEach(response => {
            if (response.error)
                throw response;
            return then(response);
        })
    }
}

axios.all(promisesResolved)
  .then(checkFailed(response => {
    console.log('SUCCESS', response)
  }))
  .catch((err) => {
    console.log('FAIL', err)
  });

相关问题