web-dev-qa-db-ja.com

axios.allが広がり、すべてをキャッチ

私は私のajaxリクエストを処理するために人気のあるライブラリ 'axios'の.allメソッドを使用しています。

しかし、すべてのリクエストが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
        });

enter image description here

したがって、「キャッチ」されたエラーは1つだけのようです。

どうすればそれらすべてを捕まえることができますか?または、何か最後に..

8
WebArtisan

(すでにご存じのように)問題は、最初のpromiseが拒否されるとすぐにcatchブロックに入り、失敗したすべての応答を同じcatchに収集することが不可能になることです。ただし、失敗したプロミスを手動で処理してエラーを集計し、後でスローすることもできます。

これがあなたのために働くことを確認してください:

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)
  });

少なくとも1つのpromiseが失敗すると、catchブロックに入ります。応答のerr配列をチェックすることでどれを見つけることができます。

7
dfsq

これは、Promise.allのフェイルファースト動作のために可能ではないと思います。リクエストのいずれかが失敗した場合、それらは自動的に原因であり、Catchの結果になります。

    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を出力します。同様の機能がリポジトリで要求されたので、不可能だと彼らは言ったと思います。

私はこれをコメントとして残しましたが、まだ十分な評判がありません。

1
Charlie