私は私の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
});
したがって、「キャッチ」されたエラーは1つだけのようです。
どうすればそれらすべてを捕まえることができますか?または、何か最後に..
(すでにご存じのように)問題は、最初の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
配列をチェックすることでどれを見つけることができます。
これは、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を出力します。同様の機能がリポジトリで要求されたので、不可能だと彼らは言ったと思います。
私はこれをコメントとして残しましたが、まだ十分な評判がありません。