teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

3

修正の追加

2021/07/14 07:55

投稿

Anon_
Anon_

スコア334

title CHANGED
File without changes
body CHANGED
@@ -32,4 +32,47 @@
32
32
  }
33
33
  })
34
34
  );
35
+ ```
36
+
37
+
38
+ [修正コード]
39
+ ```ここに言語を入力
40
+
41
+ var list = [
42
+ {
43
+ url: 'example.com',
44
+ flag: false,
45
+ },
46
+ {
47
+ url: 'sub2.example.com',
48
+ flag: false,
49
+ }
50
+ ];
51
+
52
+
53
+ list.map( (obj, index) => {
54
+ Promise.all(
55
+ Array(3).fill(null).map(
56
+ fetch(obj.url)
57
+ .then( res => {
58
+ return res.json()
59
+ })
60
+ .then(json => {
61
+ if(json.success){
62
+ list[index].flag = true;
63
+ }
64
+ })
65
+ .catch( err => {
66
+ console.log(err);
67
+ })
68
+ )
69
+ ).then( data=>
70
+ if( obj.flag ){
71
+ //3発のうちどれかが成功していれば実行
72
+ }
73
+ ).catch( e => {
74
+ console.log(e);
75
+ })
76
+ })
77
+
35
78
  ```

2

コードの修正

2021/07/14 07:55

投稿

Anon_
Anon_

スコア334

title CHANGED
File without changes
body CHANGED
@@ -10,7 +10,6 @@
10
10
 
11
11
  「追記コード」
12
12
  ```JS
13
-
14
13
  var list = [
15
14
  {
16
15
  url: 'example.com',
@@ -23,11 +22,11 @@
23
22
  Promise.all(
24
23
  list.map( async(obj) => {
25
24
  for(let i=0; i<3; i++){
26
- let res = await fetch(obj.url);
25
+ let res = await (await fetch(obj.url)).json();
27
- if(res){
26
+ if(res.success){
28
- let res2 = await fetch(obj.url+'?para=test');
27
+ let res2 = await (await fetch(obj.url)).json();
29
- if(res2){
28
+ if(res2.success){
30
- break;
29
+ break;
31
30
  }
32
31
  }
33
32
  }

1

サンプルの追記

2021/07/14 06:45

投稿

Anon_
Anon_

スコア334

title CHANGED
File without changes
body CHANGED
@@ -1,2 +1,36 @@
1
1
  Promise.allの中でfor分を使っているのですが、その中でawaitを使用しているため、forの処理が順番に実行されます。
2
- これは当然のことだと思うのですが、このforの処理を並列で処理したいのですがこの場合Promise.allの中でさらにPromise.allを使用する形が正しいのでしょうか?
2
+ これは当然のことだと思うのですが、このforの処理を並列で処理したいのですがこの場合Promise.allの中でさらにPromise.allを使用する形が正しいのでしょうか?
3
+
4
+
5
+ 実際のコードを提示できず、うまく伝えられるか分かりませんが下記のようなことをやろうとしています。
6
+ listに複数のURLが格納されていて、そこにfetchでアクセスし、仮に取得できたらそのURLにパラメータを付与して次の情報をfetchで取得ということをやりたいので、Promiseの中でawaitを使用しています。
7
+ ただ、1度目のアクセスで必ず情報が取得できるというわけではない特殊な状況のため、同じURLに対して同時に3発リクエストを投げて成功したものがあればあれば即時breakというようなことをやりたいのですが良い方法が思いつきません。
8
+
9
+
10
+
11
+ 「追記コード」
12
+ ```JS
13
+
14
+ var list = [
15
+ {
16
+ url: 'example.com',
17
+ },
18
+ {
19
+ url: 'sub2.example.com',
20
+ }
21
+ ];
22
+
23
+ Promise.all(
24
+ list.map( async(obj) => {
25
+ for(let i=0; i<3; i++){
26
+ let res = await fetch(obj.url);
27
+ if(res){
28
+ let res2 = await fetch(obj.url+'?para=test');
29
+ if(res2){
30
+ break;
31
+ }
32
+ }
33
+ }
34
+ })
35
+ );
36
+ ```