axios.all传播并抓住所有

Web*_*san 7 javascript ajax axios

我正在使用.all方法的流行库'axios'来处理我的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
        });
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

所以,似乎只有一个错误已被"抓住".

我怎么能抓住他们呢?或者也许有任何一种.最终?

dfs*_*fsq 7

问题(正如您已经知道的)是,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)
  });
Run Code Online (Sandbox Code Playgroud)

catch如果至少有一个承诺失败,你将陷入阻碍.您可以通过检查err响应数组找到一个.


Cha*_*lie 1

由于 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)
    })
Run Code Online (Sandbox Code Playgroud)

生成的代码将始终打印 1,因为它是第一个失败的。我认为存储库上请求了类似的功能,但他们说这是不可能的。

我本来打算将此作为评论,但还没有足够高的声誉。