フォールトトレラント JSON をフェッチする
前のタスク フォールトトレラント Promise.all の解答を改良しましょう。今 fetch
を呼び出すだけでなく、指定されたURLからJSONオブジェクトを読み込む必要があります。
ここにそれを行うサンプルコードがあります:
let urls = [
'https://api.github.com/users/iliakan',
'https://api.github.com/users/remy',
'https://api.github.com/users/jeresig'
];
// フェッチリクエストを作成
Promise.all(urls.map(url => fetch(url)))
// 各レスポンスを response.json() にマップする
.then(responses => Promise.all(
responses.map(r => r.json())
))
// 各ユーザ名を表示
.then(users => { // (*)
for(let user of users) {
alert(user.name);
}
});
問題は、任意のリクエストが失敗した場合、Promise.all
はエラーで reject し、他のすべてのリクエストの結果を失うことです。したがって、前のタスクのように上のコードはフォールトトレラントではありません。
行 (*)
で、配列には成功したリクエストに対してはパースされた JSONを、エラーとなったものに対してはエラーを含むようにコードを修正してください。
エラーは fetch
(ネットワークリクエストが失敗する場合)と response.json()
(レスポンスが有効なJSONでない場合)の両方で発生する可能性があることに注意してください。どちらの場合も、エラーは結果オブジェクトのメンバになります。
サンドボックスには、これらの両方のケースがあります。