回答編集履歴
4
最初の行が変だったので修正
answer
CHANGED
@@ -11,9 +11,8 @@
|
|
11
11
|
});
|
12
12
|
```
|
13
13
|
|
14
|
-
まぁこれだとOutputの結果を取得することになるので要件を満たせるかどうかは怪しいですが、
|
15
|
-
|
14
|
+
まぁやりたいのはこういうことですね。
|
16
|
-
なんじゃこりゃ、配列の要素
|
15
|
+
なんじゃこりゃ、配列の要素数が増減したらまるで対応出来ないじゃないか!
|
17
16
|
|
18
17
|
これが質問開始時の困っているポイントですね。
|
19
18
|
おっしゃる通りPromiseはこれが辛いです。
|
3
ちょっと書き直し
answer
CHANGED
@@ -13,15 +13,23 @@
|
|
13
13
|
|
14
14
|
まぁこれだとOutputの結果を取得することになるので要件を満たせるかどうかは怪しいですが、
|
15
15
|
手作業でv1〜v4を繋げるわけですね。
|
16
|
-
なんじゃこりゃ、
|
16
|
+
なんじゃこりゃ、配列の要素内を個別に取得していく仕組みに出来ないじゃないか。
|
17
17
|
|
18
|
+
これが質問開始時の困っているポイントですね。
|
19
|
+
おっしゃる通りPromiseはこれが辛いです。
|
20
|
+
単にforEachやループを使ってしまうと、全てがほぼ同時に走ってしまいしっちゃかめっちゃかになってしまいます。
|
21
|
+
|
18
22
|
turbgraphics200さんがやってることは、reduceやforEachなどを使って
|
19
|
-
塊魂のようにpromiseを転がしながらthenを何度も宣言して付け足していく流れ
|
23
|
+
塊魂のようにpromiseを転がしながらthenを何度も宣言して付け足していく流れです。
|
24
|
+
reduceは一見びっくりしますが、よくよく調べると上記の事を着実にこなしているのがわかります。
|
20
25
|
|
21
26
|
---
|
22
27
|
|
28
|
+
しかし、初見さんにPromiseやるならreduceつかえと言われても辛いものがあるでしょう。
|
23
|
-
|
29
|
+
ES2017でasync/awaitが用意されていますので、こっち使えば普通のfor文で書けて楽です。
|
30
|
+
|
31
|
+
async/awaitは内部的にはPromiseを利用していますが、
|
24
|
-
|
32
|
+
このようにfor文を使ってまるで同期的であるかのように記述していけます。
|
25
33
|
今回はfor...ofを使って書いてみました。
|
26
34
|
|
27
35
|
```JavaScript
|
@@ -29,9 +37,11 @@
|
|
29
37
|
function async main(entity) {
|
30
38
|
try {
|
31
39
|
for (var v of entity) {
|
40
|
+
// awaitを指定するとpromiseのresolveが叩かれるまで待ってくれる
|
32
41
|
await output(v);
|
33
42
|
}
|
34
43
|
} catch (err) {
|
44
|
+
// awaitのpromiseがrejectになるとこっちに入る
|
35
45
|
logger.error(err.message);
|
36
46
|
}
|
37
47
|
}
|
2
outputからasyncを削除
answer
CHANGED
File without changes
|
1
元からpromiseを返す関数からasync宣言を排除
answer
CHANGED
@@ -36,7 +36,7 @@
|
|
36
36
|
}
|
37
37
|
}
|
38
38
|
|
39
|
-
function
|
39
|
+
function output (report) {
|
40
40
|
return new Promise((resolve, reject) => {
|
41
41
|
fs.writeFile('path', 'fileName', err => {
|
42
42
|
err ? reject(err.message) : resolve();
|