Promise.allの中でfor分を使っているのですが、その中でawaitを使用しているため、forの処理が順番に実行されます。
これは当然のことだと思うのですが、このforの処理を並列で処理したいのですがこの場合Promise.allの中でさらにPromise.allを使用する形が正しいのでしょうか?
実際のコードを提示できず、うまく伝えられるか分かりませんが下記のようなことをやろうとしています。
listに複数のURLが格納されていて、そこにfetchでアクセスし、仮に取得できたらそのURLにパラメータを付与して次の情報をfetchで取得ということをやりたいので、Promiseの中でawaitを使用しています。
ただ、1度目のアクセスで必ず情報が取得できるというわけではない特殊な状況のため、同じURLに対して同時に3発リクエストを投げて成功したものがあればあれば即時breakというようなことをやりたいのですが良い方法が思いつきません。
「追記コード」
JS
1var list = [ 2 { 3 url: 'example.com', 4 }, 5 { 6 url: 'sub2.example.com', 7 } 8 ]; 9 10 Promise.all( 11 list.map( async(obj) => { 12 for(let i=0; i<3; i++){ 13 let res = await (await fetch(obj.url)).json(); 14 if(res.success){ 15 let res2 = await (await fetch(obj.url)).json(); 16 if(res2.success){ 17 break; 18 } 19 } 20 } 21 }) 22 );
[修正コード]
var list = [ { url: 'example.com', flag: false, }, { url: 'sub2.example.com', flag: false, } ]; list.map( (obj, index) => { Promise.all( Array(3).fill(null).map( fetch(obj.url) .then( res => { return res.json() }) .then(json => { if(json.success){ list[index].flag = true; } }) .catch( err => { console.log(err); }) ) ).then( data=> if( obj.flag ){ //3発のうちどれかが成功していれば実行 } ).catch( e => { console.log(e); }) })
回答3件
あなたの回答
tips
プレビュー