回答編集履歴

6

誤字修正

2019/11/19 06:56

投稿

nico25
nico25

スコア830

test CHANGED
@@ -38,7 +38,11 @@
38
38
 
39
39
  setTimeout は Promise 型のオブジェクトを返さないからです。
40
40
 
41
+
42
+
41
- async 関数の処理を途中で止めるには、await 文を使えば止めることができます。
43
+ async 関数は、await 文を使って止めることができます(処理が完了するのを待つことができます)
44
+
45
+ なぜなら async 関数は Promise 型のオブジェクトを返してくれるからです。
42
46
 
43
47
 
44
48
 

5

誤字修正

2019/11/19 06:56

投稿

nico25
nico25

スコア830

test CHANGED
@@ -274,16 +274,14 @@
274
274
 
275
275
 
276
276
 
277
- async 関数で非同期処理を途中で止めることができるのは await 文だけです。
277
+ async 関数の中非同期処理を途中で止めることができるのは await 文だけです。
278
-
278
+
279
- await 文で止められるのは Promise 型のオブジェクトだけです。
279
+ await 文で止められるのは Promise 型のオブジェクトだけです。
280
280
 
281
281
 
282
282
 
283
283
  setTimeout は
284
284
 
285
- Promise 型のオブジェクトを返さず
286
-
287
- Undefined 型のオブジェクト(即ち undefined)を返すので、
285
+ Promise 型のオブジェクトを返さず Number 型のオブジェクトを返しま
288
-
286
+
289
- await 文で止められず突き抜けています。
287
+ そのため await 文で処理を止めることができ突き抜けていってしいます。

4

誤字修正

2019/11/19 06:48

投稿

nico25
nico25

スコア830

test CHANGED
@@ -76,13 +76,101 @@
76
76
 
77
77
  #### ②
78
78
 
79
- 以下のコードをコンソールにコピペして実行したとき
79
+ 以下のコードをコンソールにコピペして実行したとき...
80
+
81
+
82
+
80
-
83
+ ```js
84
+
85
+ async function main() {
86
+
87
+ let start, end
88
+
89
+
90
+
91
+ start = Date.now()
92
+
93
+ await f()
94
+
95
+ end = Date.now()
96
+
97
+ console.log(end - start) // <--- 実行結果 1
98
+
99
+
100
+
101
+ start = Date.now()
102
+
103
+ await g()
104
+
105
+ end = Date.now()
106
+
107
+ console.log(end - start) // <--- 実行結果 2
108
+
109
+ }
110
+
111
+
112
+
113
+ async function f() {
114
+
115
+ await sleep(1000)
116
+
117
+ await sleep(1000)
118
+
119
+ await sleep(1000)
120
+
121
+ }
122
+
123
+
124
+
125
+ async function g() {
126
+
127
+ const promise0 = sleep(1000);
128
+
129
+ const promise1 = sleep(1000);
130
+
131
+ const promise2 = sleep(1000);
132
+
133
+ await promise0;
134
+
135
+ await promise1;
136
+
137
+ await promise2;
138
+
139
+ }
140
+
141
+
142
+
143
+ function sleep(time) {
144
+
145
+ return new Promise((resolve, reject) => {
146
+
147
+ setTimeout(() => {
148
+
149
+ resolve()
150
+
151
+ }, time)
152
+
153
+ })
154
+
155
+ }
156
+
157
+
158
+
159
+ main()
160
+
161
+ ```
162
+
163
+
164
+
165
+ * [[Javascript] async, await を使った非同期処理入門まとめ](https://webbibouroku.com/Blog/Article/js-async-await)
166
+
167
+
168
+
81
- 実行結果 1, 2 に表示される組み合わせとして
169
+ console.log の実行結果 1, 2 に表示される組み合わせとして
82
170
 
83
171
  もっとも近いものは、次のうちどれですか?
84
172
 
85
- なお表示される結果は完全には、一致しません。
173
+ なお表示される結果は完全には、一致しません。だいたいの値です。
86
174
 
87
175
 
88
176
 
@@ -100,94 +188,6 @@
100
188
 
101
189
 
102
190
 
103
- コピペして実行するコードは以下の通りです。
104
-
105
-
106
-
107
- ```js
108
-
109
- async function main() {
110
-
111
- let start, end
112
-
113
-
114
-
115
- start = Date.now()
116
-
117
- await f()
118
-
119
- end = Date.now()
120
-
121
- console.log(end - start) // <--- 実行結果 1
122
-
123
-
124
-
125
- start = Date.now()
126
-
127
- await g()
128
-
129
- end = Date.now()
130
-
131
- console.log(end - start) // <--- 実行結果 2
132
-
133
- }
134
-
135
-
136
-
137
- async function f() {
138
-
139
- await sleep(1000)
140
-
141
- await sleep(1000)
142
-
143
- await sleep(1000)
144
-
145
- }
146
-
147
-
148
-
149
- async function g() {
150
-
151
- const promise0 = sleep(1000);
152
-
153
- const promise1 = sleep(1000);
154
-
155
- const promise2 = sleep(1000);
156
-
157
- await promise0;
158
-
159
- await promise1;
160
-
161
- await promise2;
162
-
163
- }
164
-
165
-
166
-
167
- function sleep(time) {
168
-
169
- return new Promise((resolve, reject) => {
170
-
171
- setTimeout(() => {
172
-
173
- resolve()
174
-
175
- }, time)
176
-
177
- })
178
-
179
- }
180
-
181
-
182
-
183
- main()
184
-
185
- ```
186
-
187
-
188
-
189
- * [[Javascript] async, await を使った非同期処理入門まとめ](https://webbibouroku.com/Blog/Article/js-async-await)
190
-
191
191
 
192
192
 
193
193
  ### 解答

3

誤字修正

2019/11/19 06:33

投稿

nico25
nico25

スコア830

test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- `setTimeout` 関数を使って、`async` 関数を止めたい』
5
+ 『setTimeout を使って、async 関数を止めたい』
6
6
 
7
7
 
8
8
 
@@ -10,17 +10,23 @@
10
10
 
11
11
 
12
12
 
13
+ > sampleResolve 関数と sampleResolve2 関数は
14
+
15
+ > Premise 型を返す関数として定義されていますが、
16
+
17
+ > この二つの関数をAsyncで書き直すことはできるのでしょうか?
18
+
19
+
20
+
13
21
 
14
22
 
15
23
  ### 結論
16
24
 
17
25
 
18
26
 
19
- できません。
27
+ 残念ながら、できません。
20
-
21
-
22
-
23
- > sampleResolve 関数と sampleResolve2 関数は Premise 型を返す関数として定義されていますが、この二つの関数をAsyncで書き直すことはできるのでしょうか?
28
+
29
+
24
30
 
25
31
 
26
32
 
@@ -30,77 +36,151 @@
30
36
 
31
37
 
32
38
 
33
- setTimeout 関数は Promise を返さないからです。
39
+ setTimeout は Promise 型のオブジェクトを返さないからです。
34
-
35
-
36
-
40
+
37
- async 関数の処理を途中で止めるには、await を使えば止めることができます。
41
+ async 関数の処理を途中で止めるには、await を使えば止めることができます。
42
+
43
+
44
+
38
-
45
+ ここで大事なのは
39
-
40
-
46
+
41
- ここで大事なのは **await で止めることができるのは Promise だけ** です。
47
+ **await で止めることができるのは Promise 型のオブジェクトだけ**
48
+
42
-
49
+ だと言うことです。
50
+
51
+
52
+
43
-
53
+ ### 問題
54
+
55
+
56
+
44
-
57
+ #### ①
58
+
59
+
60
+
61
+ setTimeout 関数が返すオブジェクトの型は、次のうちどれですか?
62
+
63
+
64
+
65
+ 1. Undefined 型のオブジェクト
66
+
67
+ 2. Promise 型のオブジェクト
68
+
69
+ 3. Number 型のオブジェクト
70
+
71
+
72
+
73
+
74
+
75
+
76
+
77
+ #### ②
78
+
45
- 以下のコードをコンソールにコピペして実行して見ると、雰囲気がつかめます。
79
+ 以下のコードをコンソールにコピペして実行し
80
+
81
+ 実行結果 1, 2 に表示される組み合わせとして
82
+
83
+ もっとも近いものは、次のうちどれですか?
84
+
85
+ なお表示される結果は完全には、一致しません。
86
+
87
+
88
+
89
+ |選択肢|実行結果 1|実行結果 2|
90
+
91
+ |:--:|:--:|:--:|
92
+
93
+ |1|1000|1000|
94
+
95
+ |2|1000|3000|
96
+
97
+ |3|3000|1000|
98
+
99
+ |4|3000|3000|
100
+
101
+
102
+
103
+ コピペして実行するコードは以下の通りです。
46
104
 
47
105
 
48
106
 
49
107
  ```js
50
108
 
51
- // 2秒後に値を返す
52
-
53
- function getNum(num) {
54
-
55
- return new Promise((resolve, reject) => {
56
-
57
- setTimeout(() => {
58
-
59
- resolve(num);
60
-
61
- }, 2000);
62
-
63
- });
64
-
65
- }
66
-
67
-
68
-
69
- // 6秒後に出力
70
-
71
- async function f1() {
72
-
73
- const n1 = await getNum(1);
74
-
75
- const n2 = await getNum(2);
76
-
77
- const n3 = await getNum(3);
78
-
79
- console.log(n1, n2, n3);
80
-
81
- }
82
-
83
-
84
-
85
- // 2秒後に出力
86
-
87
- async function f2() {
88
-
89
- const p1 = getNum(1);
90
-
91
- const p2 = getNum(2);
92
-
93
- const p3 = getNum(3);
94
-
95
- const n1 = await p1;
96
-
97
- const n2 = await p2;
98
-
99
- const n3 = await p3;
100
-
101
- console.log(n1, n2, n3);
102
-
103
- }
109
+ async function main() {
110
+
111
+ let start, end
112
+
113
+
114
+
115
+ start = Date.now()
116
+
117
+ await f()
118
+
119
+ end = Date.now()
120
+
121
+ console.log(end - start) // <--- 実行結果 1
122
+
123
+
124
+
125
+ start = Date.now()
126
+
127
+ await g()
128
+
129
+ end = Date.now()
130
+
131
+ console.log(end - start) // <--- 実行結果 2
132
+
133
+ }
134
+
135
+
136
+
137
+ async function f() {
138
+
139
+ await sleep(1000)
140
+
141
+ await sleep(1000)
142
+
143
+ await sleep(1000)
144
+
145
+ }
146
+
147
+
148
+
149
+ async function g() {
150
+
151
+ const promise0 = sleep(1000);
152
+
153
+ const promise1 = sleep(1000);
154
+
155
+ const promise2 = sleep(1000);
156
+
157
+ await promise0;
158
+
159
+ await promise1;
160
+
161
+ await promise2;
162
+
163
+ }
164
+
165
+
166
+
167
+ function sleep(time) {
168
+
169
+ return new Promise((resolve, reject) => {
170
+
171
+ setTimeout(() => {
172
+
173
+ resolve()
174
+
175
+ }, time)
176
+
177
+ })
178
+
179
+ }
180
+
181
+
182
+
183
+ main()
104
184
 
105
185
  ```
106
186
 
@@ -110,29 +190,49 @@
110
190
 
111
191
 
112
192
 
113
- ### 問題
193
+ ### 解答
114
-
115
-
116
-
117
- setTimeout 関数は、何を返しますか?
194
+
118
-
119
-
120
-
195
+
196
+
121
- 1. undefined
197
+ ####
122
-
123
- 2. Promise 型のオブジェクト
198
+
124
-
125
-
126
-
127
- 正解は 1 番です。
199
+ 正解は 3 番です。
128
-
200
+
129
- **setTimeout は Promise を返しません。** なので await で止めることができません。
201
+ **setTimeout は Promise 型のオブジェクトを返しません。**
202
+
203
+ なので await 文で止めることができません。
204
+
205
+
206
+
207
+ ```javascript
208
+
209
+ const type = (object) => Object.prototype.toString.call(object).slice(8, -1)
210
+
211
+ type(setTimeout(()=>{}, 0))
212
+
213
+ ```
214
+
215
+ ```
216
+
217
+ > type(setTimeout(()=>{}, 0))
218
+
219
+ "Number"
220
+
221
+ >
222
+
223
+ ```
224
+
225
+
226
+
227
+ #### ②
228
+
229
+ 正解は 3 番です。
130
230
 
131
231
 
132
232
 
133
233
  ### 補足
134
234
 
135
- #### Promise は setTimeout で主に使い、他ではあまり使わない
235
+ #### Promise は setTimeout で主に使い、他ではあまり使わない
136
236
 
137
237
 
138
238
 
@@ -140,15 +240,21 @@
140
240
 
141
241
 
142
242
 
143
- > ただ、new Promise(...)と、Promiseの前にnewを付ける書き方も、最後にコールバックを受け取る関数以外(setTimeoutとか)を扱う以外は基本的に使うことはほとんどないでしょう。
243
+ > ただ、new Promise(...)と、Promiseの前にnewを付ける書き方も、
244
+
245
+ > 最後にコールバックを受け取る関数以外(setTimeoutとか)を扱う以外は
246
+
247
+ > 基本的に使うことはほとんどないでしょう。
144
248
 
145
249
  > [イマドキのJavaScriptの書き方2018 - Qiita](https://qiita.com/shibukawa/items/19ab5c381bbb2e09d0d9#%E9%9D%9E%E5%90%8C%E6%9C%9F%E5%87%A6%E7%90%86)
146
250
 
147
251
 
148
252
 
149
- #### sleep 関数の実装
253
+ #### sleep の実装
150
-
254
+
151
- async を止める sleep 関数を以下のような具合で書けるらしいです。個人的に勉強になったので付記しておきます。
255
+ async 関数を止める sleep させるような処理を以下のような具合で書けるらしいです。
256
+
257
+ 個人的に勉強になったので付記しておきます。
152
258
 
153
259
 
154
260
 
@@ -168,10 +274,16 @@
168
274
 
169
275
 
170
276
 
171
- async 関数で非同期処理を途中で止めることができるのは await だけです。
277
+ async 関数で非同期処理を途中で止めることができるのは await だけです。
172
-
278
+
173
- await で止められるのは Promise だけです。
279
+ await で止められるのは Promise 型のオブジェクトだけです。
280
+
281
+
282
+
174
-
283
+ setTimeout は
284
+
285
+ Promise 型のオブジェクトを返さず
286
+
175
- setTimeout Promise を返さず undefined を返すので、
287
+ Undefined 型のオブジェクト(即ち undefinedを返すので、
176
-
288
+
177
- await では止められず突き抜けていきます。
289
+ await では止められず突き抜けていきます。

2

誤字修正

2019/11/19 06:31

投稿

nico25
nico25

スコア830

test CHANGED
@@ -161,3 +161,17 @@
161
161
 
162
162
 
163
163
  * [awaitできるsetTimeoutを1行で書く方法 - Qiita](https://qiita.com/suin/items/99aa8641d06b5f819656)
164
+
165
+
166
+
167
+ ### まとめ
168
+
169
+
170
+
171
+ async 関数で非同期処理を途中で止めることができるのは await だけです。
172
+
173
+ await で止められるのは Promise だけです。
174
+
175
+ setTimeout は Promise を返さず undefined を返すので、
176
+
177
+ await では止められず突き抜けていきます。

1

誤字修正

2019/11/18 05:02

投稿

nico25
nico25

スコア830

test CHANGED
@@ -1,4 +1,162 @@
1
+ 意図は
2
+
3
+
4
+
5
+ 『`setTimeout` 関数を使って、`async` 関数を止めたい』
6
+
7
+
8
+
9
+ だと思っています。
10
+
11
+
12
+
13
+
14
+
15
+ ### 結論
16
+
17
+
18
+
19
+ できません。
20
+
21
+
22
+
23
+ > sampleResolve 関数と sampleResolve2 関数は Premise 型を返す関数として定義されていますが、この二つの関数をAsyncで書き直すことはできるのでしょうか?
24
+
25
+
26
+
27
+
28
+
29
+ ### 理由
30
+
31
+
32
+
33
+ setTimeout 関数は Promise を返さないからです。
34
+
35
+
36
+
37
+ async 関数の処理を途中で止めるには、await を使えば止めることができます。
38
+
39
+
40
+
41
+ ここで大事なのは **await で止めることができるのは Promise だけ** です。
42
+
43
+
44
+
45
+ 以下のコードをコンソールにコピペして実行して見ると、雰囲気がつかめます。
46
+
47
+
48
+
49
+ ```js
50
+
51
+ // 2秒後に値を返す
52
+
53
+ function getNum(num) {
54
+
55
+ return new Promise((resolve, reject) => {
56
+
57
+ setTimeout(() => {
58
+
59
+ resolve(num);
60
+
61
+ }, 2000);
62
+
63
+ });
64
+
65
+ }
66
+
67
+
68
+
69
+ // 6秒後に出力
70
+
71
+ async function f1() {
72
+
73
+ const n1 = await getNum(1);
74
+
75
+ const n2 = await getNum(2);
76
+
77
+ const n3 = await getNum(3);
78
+
79
+ console.log(n1, n2, n3);
80
+
81
+ }
82
+
83
+
84
+
85
+ // 2秒後に出力
86
+
87
+ async function f2() {
88
+
89
+ const p1 = getNum(1);
90
+
91
+ const p2 = getNum(2);
92
+
93
+ const p3 = getNum(3);
94
+
95
+ const n1 = await p1;
96
+
97
+ const n2 = await p2;
98
+
99
+ const n3 = await p3;
100
+
101
+ console.log(n1, n2, n3);
102
+
103
+ }
104
+
105
+ ```
106
+
107
+
108
+
109
+ * [[Javascript] async, await を使った非同期処理入門まとめ](https://webbibouroku.com/Blog/Article/js-async-await)
110
+
111
+
112
+
113
+ ### 問題
114
+
115
+
116
+
117
+ setTimeout 関数は、何を返しますか?
118
+
119
+
120
+
1
- これがお望みのものかなと
121
+ 1. undefined
122
+
123
+ 2. Promise 型のオブジェクト
124
+
125
+
126
+
127
+ 正解は 1 番です。
128
+
129
+ **setTimeout は Promise を返しません。** なので await で止めることができません。
130
+
131
+
132
+
133
+ ### 補足
134
+
135
+ #### Promise は setTimeout で主に使い、他ではあまり使わない
136
+
137
+
138
+
139
+ らしいです。以下の記事がとても勉強になります。
140
+
141
+
142
+
143
+ > ただ、new Promise(...)と、Promiseの前にnewを付ける書き方も、最後にコールバックを受け取る関数以外(setTimeoutとか)を扱う以外は基本的に使うことはほとんどないでしょう。
144
+
145
+ > [イマドキのJavaScriptの書き方2018 - Qiita](https://qiita.com/shibukawa/items/19ab5c381bbb2e09d0d9#%E9%9D%9E%E5%90%8C%E6%9C%9F%E5%87%A6%E7%90%86)
146
+
147
+
148
+
149
+ #### sleep 関数の実装
150
+
151
+ async を止める sleep 関数を以下のような具合で書けるらしいです。個人的に勉強になったので付記しておきます。
152
+
153
+
154
+
155
+ ```javascript
156
+
157
+ const sleep = () => new Promise(resolve => setTimeout(resolve, 3000))
158
+
159
+ ```
2
160
 
3
161
 
4
162