回答編集履歴
17
誤解を招く部分があったため修正
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
|
-
しかし、
|
49
|
+
しかし、Promise オブジェクト自体には **name キーがない**ので
|
50
50
|
次の
|
51
51
|
```
|
52
52
|
console.log(json.name);
|
16
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
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
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
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() の戻り値は
|
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
|
-
|
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
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
|
-
|
9
|
+
console.log('json.name: ' + json.name); // 追加
|
3
|
-
|
10
|
+
}
|
4
|
-
|
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
|
-
|
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
|
-
|
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
test
CHANGED
@@ -33,7 +33,7 @@
|
|
33
33
|
どうやら res は undefined ではないようですね。
|
34
34
|
|
35
35
|
---
|
36
|
-
次に、なぜ違いが出るのか。
|
36
|
+
次に、(おそらく質問の本質であるところの)なぜ違いが出るのか。
|
37
37
|
|
38
38
|
① 2番目のコードの処理の流れ
|
39
39
|
```
|
10
test
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
> resに結果が入ってから次の「res.json()」が実行される認識ですので、「res」が「undefined」とはならないのでは?という疑問です。
|
3
3
|
|
4
4
|
「『res』が『undefined』とはならないのでは?という疑問です」 という文の後に、特に res の内容を確認されてもいなかったことから、この質問は
|
5
|
-
「Promise云々かくかくしかじかで『res』
|
5
|
+
「Promise云々かくかくしかじかで『res』は『undefined』にはならないと思っていたのに、(console.log(json.name)を)試したら undefined になった。なぜ 2番目のコードでは res が undefinedになるのか?」
|
6
6
|
という疑問を問うものであると解釈しました。
|
7
7
|
|
8
8
|
これを前提として以下述べます。
|
9
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
test
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
まず質問内容について
|
2
2
|
> resに結果が入ってから次の「res.json()」が実行される認識ですので、「res」が「undefined」とはならないのでは?という疑問です。
|
3
3
|
|
4
|
+
「『res』が『undefined』とはならないのでは?という疑問です」 という文の後に、特に res の内容を確認されてもいなかったことから、この質問は
|
4
|
-
「『res』が『undefined』
|
5
|
+
「『res』が『undefined』にはならないと思っていたのに、(console.log(json.name)を)試したら undefined になった。なぜ 2番目のコードでは res が undefinedになるのか?」
|
6
|
+
という疑問を問うものであると解釈しました。
|
5
7
|
|
6
8
|
これを前提として以下述べます。
|
7
9
|
|
7
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
|
-
|
47
|
+
したがって、変数 json は Promise オブジェクトに紐付けられることになります。
|
49
48
|
|
50
49
|
しかし、(この時点で変数 json に紐付けられている) Promise オブジェクト自体には **name キーがない**ので
|
50
|
+
次の
|
51
51
|
```
|
52
52
|
console.log(json.name);
|
53
53
|
```
|
6
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
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
|
-
|
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
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
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
|
-
そのコードでは
|
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
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
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
|
-
|
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
|
|