teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

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

2018/02/19 10:58

投稿

miyabi-sun
miyabi-sun

スコア21461

answer CHANGED
@@ -11,9 +11,8 @@
11
11
  });
12
12
  ```
13
13
 
14
- まぁこれだとOutputの結果を取得することになるので要件を満たせるかどうかは怪しいですが、
15
- 手作業v1〜v4を繋げるわけですね。
14
+ まぁやりたいのはこういうことですね。
16
- なんじゃこりゃ、配列の要素内を個別に取得ていく仕組みに出来ないじゃないか
15
+ なんじゃこりゃ、配列の要素数が増減たらまるで対応出来ないじゃないか
17
16
 
18
17
  これが質問開始時の困っているポイントですね。
19
18
  おっしゃる通りPromiseはこれが辛いです。

3

ちょっと書き直し

2018/02/19 10:58

投稿

miyabi-sun
miyabi-sun

スコア21461

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
- というわけでPromiseは辛いんで、ES2017でasync/awaitが用意されています。
29
+ ES2017でasync/awaitが用意されていますので、こっち使えば普通のfor文で書けて楽です
30
+
31
+ async/awaitは内部的にはPromiseを利用していますが、
24
- 内部的にはPromiseを利用していますが、このようにfor文を使ってまるで同期的であるかのように記述していけます。
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を削除

2018/02/19 10:56

投稿

miyabi-sun
miyabi-sun

スコア21461

answer CHANGED
File without changes

1

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

2018/02/19 08:04

投稿

miyabi-sun
miyabi-sun

スコア21461

answer CHANGED
@@ -36,7 +36,7 @@
36
36
  }
37
37
  }
38
38
 
39
- function async output (report) {
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();