回答編集履歴

2

2007じゃなくて2017だよ

2021/04/20 14:24

投稿

miyabi-sun
miyabi-sun

スコア21158

test CHANGED
@@ -230,7 +230,7 @@
230
230
 
231
231
 
232
232
 
233
- そのためにasync/awaitはES2007という新しいバージョンで追加されました。
233
+ そのためにasync/awaitはES2017という新しいバージョンで追加されました。
234
234
 
235
235
  これでPromiseなんたらを書きまくる必要はなくなりましたが、
236
236
 

1

promiseで記述しなおしたコードをオマケで追加

2021/04/20 14:24

投稿

miyabi-sun
miyabi-sun

スコア21158

test CHANGED
@@ -127,3 +127,117 @@
127
127
  }
128
128
 
129
129
  ```
130
+
131
+
132
+
133
+ ---
134
+
135
+
136
+
137
+ async functionを開きます。
138
+
139
+ これは「糖衣構文」なので現実世界に存在するコードではありません。
140
+
141
+ 実行される直前に正規のJSコードに変換されて実行される疑似コードです。
142
+
143
+
144
+
145
+ 上記の`_emitFizzBuzz`は実際にはこんなコードになっています
146
+
147
+
148
+
149
+ ```js
150
+
151
+ const waitFor = async ms =>
152
+
153
+ new Promise(resolve => setTimeout(resolve, ms));
154
+
155
+
156
+
157
+ function _emitFizzBuzz(eventEmitter, untill) {
158
+
159
+ return new Promise(resolve => {
160
+
161
+ waitFor(0).then(() => {
162
+
163
+ console.log("非同期じゃないの?");
164
+
165
+ console.log("違うんだね");
166
+
167
+ eventEmitter.emit("start");
168
+
169
+ let count = 1;
170
+
171
+
172
+
173
+ // ループ文の収まりをPromiseだけで記述するのは超大変なので、これで合ってるかは自信ない
174
+
175
+ let promise = Promise.resolve(null);
176
+
177
+ while (count <= untill) {
178
+
179
+ promise = promise
180
+
181
+ .then(() => waitFor(100))
182
+
183
+ .then(() => count)
184
+
185
+ .then(count => {
186
+
187
+ if (count % 15 === 0) {
188
+
189
+ eventEmitter.emit("FizzBuzz", count);
190
+
191
+ } else if (count % 3 === 0) {
192
+
193
+ eventEmitter.emit("Fizz", count);
194
+
195
+ } else if (count % 5 === 0) {
196
+
197
+ eventEmitter.emit("Buzz", count);
198
+
199
+ }
200
+
201
+ });
202
+
203
+ count++;
204
+
205
+ }
206
+
207
+ promise = promise.then(() => {
208
+
209
+ eventEmitter.emit("end");
210
+
211
+ resolve();
212
+
213
+ });
214
+
215
+ })
216
+
217
+ })
218
+
219
+ }
220
+
221
+ ```
222
+
223
+
224
+
225
+ Promiseだけでループ文を表現するとしたらこういったコードになるはずです。
226
+
227
+ なんでJSでループ文使いたいだけで、
228
+
229
+ こんなバグがあちこちに入りそうなコード書かされるんだって話になるじゃないですか。
230
+
231
+
232
+
233
+ そのためにasync/awaitはES2007という新しいバージョンで追加されました。
234
+
235
+ これでPromiseなんたらを書きまくる必要はなくなりましたが、
236
+
237
+ await演算子を使ったら、右辺で`Promise.then(fn)`メソッドを実行して、値を取り出すまで待とうとしているんだなというニュアンスの理解は必要となります。
238
+
239
+
240
+
241
+ なのでasync/awaitを使っていたとしても、
242
+
243
+ どうやってPromiseを操っているのかを抑えるようにしてください。