【问题标题】:axios.all spread and catch allaxios.all 传播并捕获所有
【发布时间】:2018-07-18 18:22:30
【问题描述】:

我正在使用流行库“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
        });

所以,似乎只有一个错误被“捕获”了。

我怎样才能全部抓到?或者也许有任何一种.finally?

【问题讨论】:

    标签: javascript ajax axios


    【解决方案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)
        })
    

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

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

    【讨论】:

    【解决方案2】:

    问题(正如您已经知道的)是,一旦第一个 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 响应数组找到其中一个。

    【讨论】:

    • 为我工作,但代码不是那么直观的理解。你能补充更多关于promisesResolvedcheckFailed在做什么的解释吗
    • @XavitojCheema 你只需要处理一些请求失败的情况。在这种情况下,您捕获它并从中返回({ error }),从而从异常中恢复。所以这个想法是让 所有 请求通过(解决),即使它失败了。如果某些事情失败,错误将作为响应对象的error 属性提供。
    • 好的,这需要更多地了解 Promise 在失败时的行为。谢谢!为了解释。
    猜你喜欢
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    • 2016-12-02
    • 2015-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-14
    相关资源
    最近更新 更多