回答編集履歴

4

最初の行が変だったので修正

2018/02/19 10:58

投稿

miyabi-sun
miyabi-sun

スコア21158

test CHANGED
@@ -24,11 +24,9 @@
24
24
 
25
25
 
26
26
 
27
- まぁこれだとOutput結果を取得するとになるので要件を満たせるかどかは怪しいですが、
27
+ まぁやりたいこういうことですね。
28
28
 
29
- 手作業でv1〜v4を繋げるわけですね。
30
-
31
- なんじゃこりゃ、配列の要素内を個別に取得ていく仕組みに出来ないじゃないか
29
+ なんじゃこりゃ、配列の要素数が増減たらまるで対応出来ないじゃないか
32
30
 
33
31
 
34
32
 

3

ちょっと書き直し

2018/02/19 10:58

投稿

miyabi-sun
miyabi-sun

スコア21158

test CHANGED
@@ -28,13 +28,23 @@
28
28
 
29
29
  手作業でv1〜v4を繋げるわけですね。
30
30
 
31
- なんじゃこりゃ、可変数相手じゃどうしようもないぞ?
31
+ なんじゃこりゃ、配列の要素内を個別に取得していく仕組みに出来ないじゃないか。
32
+
33
+
34
+
35
+ これが質問開始時の困っているポイントですね。
36
+
37
+ おっしゃる通りPromiseはこれが辛いです。
38
+
39
+ 単にforEachやループを使ってしまうと、全てがほぼ同時に走ってしまいしっちゃかめっちゃかになってしまいます。
32
40
 
33
41
 
34
42
 
35
43
  turbgraphics200さんがやってることは、reduceやforEachなどを使って
36
44
 
37
- 塊魂のようにpromiseを転がしながらthenを何度も宣言して付け足していく流れになることしょう
45
+ 塊魂のようにpromiseを転がしながらthenを何度も宣言して付け足していく流れで
46
+
47
+ reduceは一見びっくりしますが、よくよく調べると上記の事を着実にこなしているのがわかります。
38
48
 
39
49
 
40
50
 
@@ -42,9 +52,15 @@
42
52
 
43
53
 
44
54
 
45
- というわけでPromiseは辛いんで、ES2017でasync/awaitが用意されています
55
+ しかし、初見さんにPromiseやるならreduceつかえと言われても辛ものがあるでしょう
46
56
 
57
+ ES2017でasync/awaitが用意されていますので、こっち使えば普通のfor文で書けて楽です。
58
+
59
+
60
+
61
+ async/awaitは内部的にはPromiseを利用していますが、
62
+
47
- 内部的にはPromiseを利用していますが、このようにfor文を使ってまるで同期的であるかのように記述していけます。
63
+ このようにfor文を使ってまるで同期的であるかのように記述していけます。
48
64
 
49
65
  今回はfor...ofを使って書いてみました。
50
66
 
@@ -60,11 +76,15 @@
60
76
 
61
77
  for (var v of entity) {
62
78
 
79
+ // awaitを指定するとpromiseのresolveが叩かれるまで待ってくれる
80
+
63
81
  await output(v);
64
82
 
65
83
  }
66
84
 
67
85
  } catch (err) {
86
+
87
+ // awaitのpromiseがrejectになるとこっちに入る
68
88
 
69
89
  logger.error(err.message);
70
90
 

2

outputからasyncを削除

2018/02/19 10:56

投稿

miyabi-sun
miyabi-sun

スコア21158

test CHANGED
File without changes

1

元からpromiseを返す関数からasync宣言を排除

2018/02/19 08:04

投稿

miyabi-sun
miyabi-sun

スコア21158

test CHANGED
@@ -74,7 +74,7 @@
74
74
 
75
75
 
76
76
 
77
- function async output (report) {
77
+ function output (report) {
78
78
 
79
79
  return new Promise((resolve, reject) => {
80
80