回答編集履歴

2

ついき

2018/07/19 06:41

投稿

og24715
og24715

スコア832

test CHANGED
@@ -1,3 +1,107 @@
1
+ ## 修正というか正しい非同期処理とその同期的処理
2
+
3
+
4
+
5
+ お二方から指摘がありますが、 pro() は呼び出した瞬間同期的に console.log(3) が実行されます。
6
+
7
+ というのも Promise を生成してますが引数に与えられたコールバック関数の中でいきなり `console.log(3)` としているからですね。
8
+
9
+ 例えば **3 秒待った後に 3 と出力** するような非同期関をコールバック関数として引数に与えるのならば以下のようになります。
10
+
11
+
12
+
13
+ ```
14
+
15
+ const output3 = () => new Promise(resolve => {
16
+
17
+ setTimeout(() => {
18
+
19
+ console.log('3');
20
+
21
+ resolve();
22
+
23
+ }, 3000)
24
+
25
+ });
26
+
27
+ ```
28
+
29
+
30
+
31
+ そして以下のコードを試してみてください。
32
+
33
+
34
+
35
+ ```
36
+
37
+ output3();
38
+
39
+ console.log(2);
40
+
41
+ console.log(1);
42
+
43
+ ```
44
+
45
+
46
+
47
+ `3 2 1` と出力されそうですが、実際は `2 1 3` となります。
48
+
49
+
50
+
51
+ というのも `output3` が Promise を返す非同期処理だからですね。
52
+
53
+ output3 の Promise の処理が完了していることを期待して、 次の console.log() を実行するには `await` キーワードを使用して、 Promise の完了を待つ必要があります。
54
+
55
+ しかし、 await キーワードは `async function` の中でしか使えないという制約があるので以下のようにします。
56
+
57
+ (トップレベル await が可能な仕組みが現在作られています。ちなみに GoogleChrome の デベロッパーコンソールもトップレベル await が可能)
58
+
59
+
60
+
61
+ ```
62
+
63
+ async function() {
64
+
65
+ await output3();
66
+
67
+ console.log(2);
68
+
69
+ console.log(1);
70
+
71
+ }
72
+
73
+ ```
74
+
75
+
76
+
77
+ 関数宣言しただけでは動かないので即時呼び出しする(即時関数)
78
+
79
+
80
+
81
+ ```
82
+
83
+ (async function() {
84
+
85
+ await output3();
86
+
87
+ console.log(2);
88
+
89
+ console.log(1);
90
+
91
+ })();
92
+
93
+ ```
94
+
95
+
96
+
97
+ これを実行すると、めでたく 3秒待って 3が出力され、続いて 2, 1 となります。????
98
+
99
+
100
+
101
+ ---
102
+
103
+
104
+
1
105
  > なぜ1 5と行かないでasync functionの中に入っていくのですか?(No.1/No.2)
2
106
 
3
107
 

1

修正

2018/07/19 06:41

投稿

og24715
og24715

スコア832

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- 即時関数だから。さらに async function なので `1` の次に `5` が来るか、 `2` が来るかは保証できません。
5
+ 即時関数だから。さらに async function なので `2` の次に `5` が来るか、 `3` が来るかは保証できません。
6
6
 
7
7
 
8
8
 
@@ -18,7 +18,7 @@
18
18
 
19
19
 
20
20
 
21
- これは例が悪いですね。 pro() がもっと時間のかかる処理なら `1 2 4 5 3` となりそうですが、すぐ終わる処理なので順当に `1 2 3 4 5` となりました。これも async function なので `1` の後が `2` なのか `5` なのかは保証できません。
21
+ これは例が悪いですね。 pro() がもっと時間のかかる処理なら `1 2 4 5 3` となりそうですが、すぐ終わる処理なので順当に `1 2 3 4 5` となりました。これも async function なので `2` の後が `5` なのか `3` なのかは保証できません。
22
22
 
23
23
 
24
24