promiseのみでやった場合、こんな感じになるわけですよ。
JavaScript
1var [v1, v2, v3, v4] = reports;
2output(v1)
3 .then(() => output(v2))
4 .then(() => output(v3))
5 .then(() => output(v4))
6 .catch((e) => {
7 console.error(e);
8 });
まぁやりたいのはこういうことですね。
なんじゃこりゃ、配列の要素数が増減したらまるで対応出来ないじゃないか!
これが質問開始時の困っているポイントですね。
おっしゃる通りPromiseはこれが辛いです。
単にforEachやループを使ってしまうと、全てがほぼ同時に走ってしまいしっちゃかめっちゃかになってしまいます。
turbgraphics200さんがやってることは、reduceやforEachなどを使って
塊魂のようにpromiseを転がしながらthenを何度も宣言して付け足していく流れです。
reduceは一見びっくりしますが、よくよく調べると上記の事を着実にこなしているのがわかります。
しかし、初見さんにPromiseやるならreduceつかえと言われても辛いものがあるでしょう。
ES2017でasync/awaitが用意されていますので、こっち使えば普通のfor文で書けて楽です。
async/awaitは内部的にはPromiseを利用していますが、
このようにfor文を使ってまるで同期的であるかのように記述していけます。
今回はfor...ofを使って書いてみました。
JavaScript
1// awaitを使いたい場合は、asyncを宣言した関数でなければならない
2function async main(entity) {
3 try {
4 for (var v of entity) {
5 // awaitを指定するとpromiseのresolveが叩かれるまで待ってくれる
6 await output(v);
7 }
8 } catch (err) {
9 // awaitのpromiseがrejectになるとこっちに入る
10 logger.error(err.message);
11 }
12}
13
14function output (report) {
15 return new Promise((resolve, reject) => {
16 fs.writeFile('path', 'fileName', err => {
17 err ? reject(err.message) : resolve();
18 });
19 });
20}
21
22main(db.findAll());
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/02/19 05:26
2018/02/19 05:32
2018/02/19 05:50
2018/02/19 06:04
2018/02/19 06:08
2018/02/19 06:28
2018/02/19 06:58