回答編集履歴

17

誤解を招く部分があったため修正

2022/06/04 01:02

投稿

退会済みユーザー
test CHANGED
@@ -46,7 +46,7 @@
46
46
  Responseオブジェクトのjson() メソッドは [Promiseを返します](https://developer.mozilla.org/ja/docs/Web/API/Response/json)。
47
47
  したがって、res.json() の戻り値は Promise オブジェクトとなるため、左辺の変数 json は Promise オブジェクトに紐付けられることになります。
48
48
   
49
- しかし、(この時点で変数 json に紐付けられている) Promise オブジェクト自体には **name キーがない**ので
49
+ しかし、Promise オブジェクト自体には **name キーがない**ので
50
50
  次の
51
51
  ```
52
52
  console.log(json.name);

16

 

2022/06/03 21:00

投稿

退会済みユーザー
test CHANGED
@@ -19,11 +19,11 @@
19
19
  ```
20
20
  と表示されます。
21
21
 
22
- つまり
22
+ つまり、どうやら
23
23
  ・res は (undefined ではなく)Response オブジェクト
24
24
  ・json は Promise オブジェクト
25
25
  ・json.name は(当初確認できたように)undefined
26
- ということが分かります。
26
+ らしい、ということが分かります。
27
27
 
28
28
  まとめると、「『fetch(url)』の結果が返ってくるまで待っていて、
29
29
  resに結果が入ってから次の『res.json()』が実行される」、という質問者さんの認識はほぼ合っていますが、

15

 

2022/06/03 20:53

投稿

退会済みユーザー
test CHANGED
@@ -2,7 +2,7 @@
2
2
  ```js
3
3
  async function access(url) {
4
4
  const res = await fetch(url);
5
- console.log('res:' + res); // 追加
5
+ console.log('res: ' + res); // 追加
6
6
 
7
7
  const json = res.json();
8
8
  console.log('json: ' + json); // 修正
@@ -13,7 +13,7 @@
13
13
  ```
14
14
  として実行すると
15
15
  ```
16
- > "res:[object Response]"
16
+ > "res: [object Response]"
17
17
  > "json: [object Promise]"
18
18
  > "json.name: undefined"
19
19
  ```

14

 

2022/06/03 20:51

投稿

退会済みユーザー
test CHANGED
@@ -18,14 +18,19 @@
18
18
  > "json.name: undefined"
19
19
  ```
20
20
  と表示されます。
21
+
21
22
  つまり
22
23
  ・res は (undefined ではなく)Response オブジェクト
23
24
  ・json は Promise オブジェクト
24
25
  ・json.name は(当初確認できたように)undefined
25
26
  ということが分かります。
26
27
 
28
+ まとめると、「『fetch(url)』の結果が返ってくるまで待っていて、
29
+ resに結果が入ってから次の『res.json()』が実行される」、という質問者さんの認識はほぼ合っていますが、
30
+ 実行したときの結果が違います。
27
31
 
28
32
  ---
33
+
29
34
  なぜ違いが出るのか。
30
35
 
31
36
  ① 2番目のコードの処理の流れ

13

 

2022/06/03 20:46

投稿

退会済みユーザー
test CHANGED
@@ -39,21 +39,21 @@
39
39
  const json = res.json();
40
40
  ```
41
41
  Responseオブジェクトのjson() メソッドは [Promiseを返します](https://developer.mozilla.org/ja/docs/Web/API/Response/json)。
42
- したがって、res.json() の戻り値は Response オブジェクトとなるため、左辺の変数 json は Promise オブジェクトに紐付けられることになります。
42
+ したがって、res.json() の戻り値は Promise オブジェクトとなるため、左辺の変数 json は Promise オブジェクトに紐付けられることになります。
43
43
   
44
44
  しかし、(この時点で変数 json に紐付けられている) Promise オブジェクト自体には **name キーがない**ので
45
45
  次の
46
46
  ```
47
47
  console.log(json.name);
48
48
  ```
49
- を実行すると undefined と出力されてしまいます。
49
+ を実行すると undefined と出力されてしまいます。
50
50
 
51
51
 
52
52
  ---
53
53
  ② 最初のコードの処理の流れ
54
54
  const res = await fetch(url);
55
55
  までは①と同じです。
56
- 変数res には Response オブジェクトが紐付けられています。
56
+ 変数res には Response オブジェクトが紐付けられます。
57
57
 
58
58
  次の行:
59
59
 

12

 

2022/06/03 20:44

投稿

退会済みユーザー
test CHANGED
@@ -1,39 +1,32 @@
1
+ 2番目のコードで、res とjson と json.nameそれぞれの内容を確認するため下記のように変えてみます。
1
- まず質問内容について
2
+ ```js
3
+ async function access(url) {
4
+ const res = await fetch(url);
5
+ console.log('res:' + res); // 追加
6
+
7
+ const json = res.json();
8
+ console.log('json: ' + json); // 修正
2
- > resに結果が入ってから次の「res.json()」が実行される認識ですので、「res」が「undefined」とはならないのでは?という疑問です。
9
+ console.log('json.name: ' + json.name); // 追加
3
-  
10
+ }
4
- 「『res』が『undefined』とはならないのでは?という疑問です」 という文の後に、特に res の内容を確認されてもいなかったことから、この質問は
11
+ const url = 'https://jsonplaceholder.typicode.com/users/1';
5
- 「Promise云々かくかくしかじかで『res』は『undefined』にはならないと思っていたのに、(console.log(json.name)を)試したら undefined になった。なぜ 2番目のコードでは res が undefinedになるのか?」
6
- という疑問を問うものであると解釈しました。
7
-  
8
- これを前提として以下述べます。
12
+ access(url);
9
-  
10
- 要するに質問として
11
13
  ```
12
- console.log(json.name);
14
+ として実行すると
13
- とすると、undefined が表示された。。。なぜ。。。
14
15
  ```
16
+ > "res:[object Response]"
17
+ > "json: [object Promise]"
18
+ > "json.name: undefined"
19
+ ```
20
+ と表示されます。
21
+ つまり
22
+ ・res は (undefined ではなく)Response オブジェクト
23
+ ・json は Promise オブジェクト
24
+ ・json.name は(当初確認できたように)undefined
15
- ということのようでが、
25
+ ということが分かりま
16
- 注意深く見ればわかると思いますが、
17
- 上のコードでは「res がundefinedかどうか」は、はっきりとはわからず
18
- **json.name が undefined であるということ**しかわからないと思いますがいかがでしょう?
19
-
20
- もし「res」自体が「undefined」かどうかを知りたいなら、少なくとも
21
- console.log(res);
22
- を試してみなければならないのでは?
23
- **json.name が undefined であるということだけを見て、res も undefined になっていると結論付けるのは早計です**
24
26
 
25
27
 
26
28
  ---
27
-
28
- 試してみましょう
29
+ なぜ違いが出るのか
29
-
30
- console.log(res);
31
- とすると [object Promise] と表示されました。
32
-  
33
- どうやら res は undefined ではないようですね。
34
-
35
- ---
36
- 次に、(おそらく質問の本質であるところの)なぜ違いが出るのか。
37
30
 
38
31
  ① 2番目のコードの処理の流れ
39
32
  ```
@@ -46,8 +39,8 @@
46
39
  const json = res.json();
47
40
  ```
48
41
  Responseオブジェクトのjson() メソッドは [Promiseを返します](https://developer.mozilla.org/ja/docs/Web/API/Response/json)。
49
- したがって、変数 json は Promise オブジェクトに紐付けられることになります。
42
+ したがって、res.json() の戻り値は Response オブジェクトとなるため、左辺の変数 json は Promise オブジェクトに紐付けられることになります。
50
-
43
+  
51
44
  しかし、(この時点で変数 json に紐付けられている) Promise オブジェクト自体には **name キーがない**ので
52
45
  次の
53
46
  ```
@@ -58,21 +51,24 @@
58
51
 
59
52
  ---
60
53
  ② 最初のコードの処理の流れ
54
+ const res = await fetch(url);
55
+ までは①と同じです。
56
+ 変数res には Response オブジェクトが紐付けられています。
61
57
 
62
- async/await は Promiseシンタックスシュガーですので
58
+ 行:
59
+
63
60
  ```js
64
61
  const json = await res.json();
65
62
  console.log(json.name);
66
63
  ```
67
-
64
+ async/await Promiseのシンタックスシュガーですので、この2行は
68
65
  ```js
69
66
  res.json().then(json => console.log(json.name));
70
67
  ```
71
- 翻訳されます。
68
+ ほぼ同じです。
72
69
 
73
70
  これが実行されると、thenの後の引数「json」には、Promise の解決後のデータ(レスポンスの本文のテキストを JSON として解釈した結果データ)が格納されます。
74
71
  具体的には、urlで指定したエンドポイントからのレスポンスJSONです。
75
- これは name キーを持っています。
72
+ これは name キーを持っていますので、期待する出力となります
76
- 結果、期待する出力となります。
77
73
 
78
74
 

11

 

2022/06/03 16:54

投稿

退会済みユーザー
test CHANGED
@@ -33,7 +33,7 @@
33
33
  どうやら res は undefined ではないようですね。
34
34
 
35
35
  ---
36
- 次に、なぜ違いが出るのか。
36
+ 次に、(おそらく質問の本質であるところの)なぜ違いが出るのか。
37
37
 
38
38
  ① 2番目のコードの処理の流れ
39
39
  ```

10

 

2022/06/03 16:52

投稿

退会済みユーザー
test CHANGED
@@ -2,7 +2,7 @@
2
2
  > resに結果が入ってから次の「res.json()」が実行される認識ですので、「res」が「undefined」とはならないのでは?という疑問です。
3
3
   
4
4
  「『res』が『undefined』とはならないのでは?という疑問です」 という文の後に、特に res の内容を確認されてもいなかったことから、この質問は
5
- 「Promise云々かくかくしかじかで『res』『undefined』にはならないと思っていたのに、(console.log(json.name)を)試したら undefined になった。なぜ 2番目のコードでは res が undefinedになるのか?」
5
+ 「Promise云々かくかくしかじかで『res』『undefined』にはならないと思っていたのに、(console.log(json.name)を)試したら undefined になった。なぜ 2番目のコードでは res が undefinedになるのか?」
6
6
  という疑問を問うものであると解釈しました。
7
7
   
8
8
  これを前提として以下述べます。

9

 

2022/06/03 16:49

投稿

退会済みユーザー
test CHANGED
@@ -2,7 +2,7 @@
2
2
  > resに結果が入ってから次の「res.json()」が実行される認識ですので、「res」が「undefined」とはならないのでは?という疑問です。
3
3
   
4
4
  「『res』が『undefined』とはならないのでは?という疑問です」 という文の後に、特に res の内容を確認されてもいなかったことから、この質問は
5
- 「『res』が『undefined』にはならないと思っていたのに、(console.log(json.name)を)試したら undefined になった。なぜ 2番目のコードでは res が undefinedになるのか?」
5
+ Promise云々かくかくしかじかで『res』が『undefined』にはならないと思っていたのに、(console.log(json.name)を)試したら undefined になった。なぜ 2番目のコードでは res が undefinedになるのか?」
6
6
  という疑問を問うものであると解釈しました。
7
7
   
8
8
  これを前提として以下述べます。

8

 

2022/06/03 16:48

投稿

退会済みユーザー
test CHANGED
@@ -1,7 +1,9 @@
1
1
  まず質問内容について
2
2
  > resに結果が入ってから次の「res.json()」が実行される認識ですので、「res」が「undefined」とはならないのでは?という疑問です。
3
3
   
4
+ 「『res』が『undefined』とはならないのでは?という疑問です」 という文の後に、特に res の内容を確認されてもいなかったことから、この質問は
4
- 「『res』が『undefined』はならないのでは?という疑問です」 という文に、特に res の内容を確認されてもいなかったことから、この質問は「『res』が『undefined』にはならないと思っていたのに、試したら undefined になった。なぜ 2番目のコードでは res が undefinedになるのか?」を問うものであると解釈しました。
5
+ 「『res』が『undefined』はならないと思ってのに、(console.log(json.name)を)試したら undefined になった。なぜ 2番目のコードでは res が undefinedになるのか?」
6
+ という疑問を問うものであると解釈しました。
5
7
   
6
8
  これを前提として以下述べます。
7
9
   

7

 

2022/06/03 16:46

投稿

退会済みユーザー
test CHANGED
@@ -39,15 +39,15 @@
39
39
  ```
40
40
  まずこれによりres は Responseオブジェクトに紐つけられます。
41
41
 
42
- Responseオブジェクトのjson() メソッドは [Promiseを返します](https://developer.mozilla.org/ja/docs/Web/API/Response/json)。
43
-
44
- たがって、
42
+ して、次:
45
43
  ```
46
44
  const json = res.json();
47
45
  ```
46
+ Responseオブジェクトのjson() メソッドは [Promiseを返します](https://developer.mozilla.org/ja/docs/Web/API/Response/json)。
48
- した場合、変数 json は Promise オブジェクトに紐付けられることになります。
47
+ したがって、変数 json は Promise オブジェクトに紐付けられることになります。
49
48
 
50
49
  しかし、(この時点で変数 json に紐付けられている) Promise オブジェクト自体には **name キーがない**ので
50
+ 次の
51
51
  ```
52
52
  console.log(json.name);
53
53
  ```

6

 

2022/06/03 16:44

投稿

退会済みユーザー
test CHANGED
@@ -47,7 +47,7 @@
47
47
  ```
48
48
  とした場合、変数 json は Promise オブジェクトに紐付けられることになります。
49
49
 
50
- しかし、(この時点で変数 json に紐付けられている) Promise オブジェクトは **name キーを持たない**ので
50
+ しかし、(この時点で変数 json に紐付けられている) Promise オブジェクト自体には **name キーない**ので
51
51
  ```
52
52
  console.log(json.name);
53
53
  ```

5

  

2022/06/03 16:37

投稿

退会済みユーザー
test CHANGED
@@ -1,11 +1,18 @@
1
+ まず質問内容について
1
2
  > resに結果が入ってから次の「res.json()」が実行される認識ですので、「res」が「undefined」とはならないのでは?という疑問です。
3
+  
2
-
4
+ 「『res』が『undefined』とはならないのでは?という疑問です」 という文の後に、特に res の内容を確認されてもいなかったことから、この質問は「『res』が『undefined』にはならないと思っていたのに、試したら undefined になった。なぜ 2番目のコードでは res が undefinedになるのか?」を問うものであると解釈しました。
5
+  
6
+ これを前提として以下述べます。
7
+  
8
+ 要するに質問として
3
9
  ```
4
10
  console.log(json.name);
5
- とすると、undefined が表示された。。。
11
+ とすると、undefined が表示された。。。なぜ。。。
6
12
  ```
13
+ ということのようですが、
7
- ↑を、注意深く見ればわかると思いますが、
14
+ 注意深く見ればわかると思いますが、
8
- のコードでは「res がundefinedかどうか」は、はっきりとはわからず
15
+ のコードでは「res がundefinedかどうか」は、はっきりとはわからず
9
16
  **json.name が undefined であるということ**しかわからないと思いますがいかがでしょう?
10
17
 
11
18
  もし「res」自体が「undefined」かどうかを知りたいなら、少なくとも
@@ -16,10 +23,16 @@
16
23
 
17
24
  ---
18
25
 
26
+ 試してみましょう。
27
+
19
28
  console.log(res);
20
- とすると [object Promise] と表示されま
29
+ とすると [object Promise] と表示されました
30
+  
31
+ どうやら res は undefined ではないようですね。
21
32
 
22
33
  ---
34
+ 次に、なぜ違いが出るのか。
35
+
23
36
  ① 2番目のコードの処理の流れ
24
37
  ```
25
38
  const res = await fetch(url);

4

 

2022/06/03 16:28

投稿

退会済みユーザー
test CHANGED
@@ -11,7 +11,7 @@
11
11
  もし「res」自体が「undefined」かどうかを知りたいなら、少なくとも
12
12
  console.log(res);
13
13
  を試してみなければならないのでは?
14
- **json.name が undefined であるということだけを見て、res も undefined に違いないと結論付けるのは早計です**
14
+ **json.name が undefined であるということだけを見て、res も undefined になってと結論付けるのは早計です**
15
15
 
16
16
 
17
17
  ---

3

 

2022/06/03 16:23

投稿

退会済みユーザー
test CHANGED
@@ -1,13 +1,17 @@
1
1
  > resに結果が入ってから次の「res.json()」が実行される認識ですので、「res」が「undefined」とはならないのでは?という疑問です。
2
2
 
3
+ ```
4
+ console.log(json.name);
5
+ とすると、undefined が表示された。。。
6
+ ```
3
- 注意深く見ればわかると思いますが、
7
+ ↑を、注意深く見ればわかると思いますが、
4
- そのコードでは「res がundefinedかどうか」ははっきりわからず
8
+ そのコードでは「res がundefinedかどうか」ははっきりとはわからず
5
9
  **json.name が undefined であるということ**しかわからないと思いますがいかがでしょう?
6
10
 
7
11
  もし「res」自体が「undefined」かどうかを知りたいなら、少なくとも
8
12
  console.log(res);
9
13
  を試してみなければならないのでは?
10
- json.name が undefined であるということだけを見て、res も undefined に違いないと結論付けるのは早計です
14
+ **json.name が undefined であるということだけを見て、res も undefined に違いないと結論付けるのは早計です**
11
15
 
12
16
 
13
17
  ---

2

 

2022/06/03 16:19

投稿

退会済みユーザー
test CHANGED
@@ -16,6 +16,7 @@
16
16
  とすると [object Promise] と表示されます。
17
17
 
18
18
  ---
19
+ ① 2番目のコードの処理の流れ
19
20
  ```
20
21
  const res = await fetch(url);
21
22
  ```
@@ -37,6 +38,7 @@
37
38
 
38
39
 
39
40
  ---
41
+ ② 最初のコードの処理の流れ
40
42
 
41
43
  async/await は Promiseのシンタックスシュガーですので
42
44
  ```js

1

  

2022/06/03 16:17

投稿

退会済みユーザー
test CHANGED
@@ -16,17 +16,24 @@
16
16
  とすると [object Promise] と表示されます。
17
17
 
18
18
  ---
19
-
19
+ ```
20
20
  const res = await fetch(url);
21
+ ```
21
22
  まずこれによりres は Responseオブジェクトに紐つけられます。
22
23
 
23
24
  Responseオブジェクトのjson() メソッドは [Promiseを返します](https://developer.mozilla.org/ja/docs/Web/API/Response/json)。
24
25
 
26
+ したがって、
27
+ ```
25
28
  const json = res.json();
29
+ ```
26
- とした場合、変数 json は Promise オブジェクトに紐付けられます。
30
+ とした場合、変数 json は Promise オブジェクトに紐付けられることになります。
27
31
 
28
- しかし、Promiseオブジェクトは name キーを持たないため
32
+ しかし、(この時点で変数 json に紐付けられている) Promise オブジェクトは **name キーを持たない**ので
33
+ ```
34
+ console.log(json.name);
35
+ ```
29
- console.log(json.name); を実行すると undefined と出力されます。]
36
+ を実行すると undefined と出力されてしいます。
30
37
 
31
38
 
32
39
  ---
@@ -41,6 +48,10 @@
41
48
  res.json().then(json => console.log(json.name));
42
49
  ```
43
50
  と翻訳されます。
51
+
52
+ これが実行されると、thenの後の引数「json」には、Promise の解決後のデータ(レスポンスの本文のテキストを JSON として解釈した結果データ)が格納されます。
53
+ 具体的には、urlで指定したエンドポイントからのレスポンスJSONです。
54
+ これは name キーを持っています。
44
55
  結果、期待する出力となります。
45
56
 
46
57