回答編集履歴
2
2007じゃなくて2017だよ
test
CHANGED
@@ -230,7 +230,7 @@
|
|
230
230
|
|
231
231
|
|
232
232
|
|
233
|
-
そのためにasync/awaitはES20
|
233
|
+
そのためにasync/awaitはES2017という新しいバージョンで追加されました。
|
234
234
|
|
235
235
|
これでPromiseなんたらを書きまくる必要はなくなりましたが、
|
236
236
|
|
1
promiseで記述しなおしたコードをオマケで追加
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を操っているのかを抑えるようにしてください。
|