Promise で複数の非同期処理の待ち合わせ

More than 1 year has passed since last update.

node.js を使って、複数のディレクトリに入っているファイル名を取得するコードを書いた際に、

複数の非同期処理を待ち合わせる必要がありました。


code


search_file.js

const fs      = require('fs');

const targets = [
'./doc/hoge/',
'./doc/fuga/',
'./doc/piyo/'
];

class searchFile {
constructor( dirs ){
this.dirs = dirs;
}

show(){
Promise.all( this.dirs.map( (data) => {
return this.fileRead( data );
})).then( ( results ) => {
let flatten = Array.prototype.concat.apply([], results );
console.log( flatten );
});
}

fileRead( data ){
return new Promise( ( resolve, reject ) => {
try {
fs.readdir( data, ( err, files ) => {
if ( err ) throw err
resolve( files );
});
}
catch( err ){
console.log( err.message );
reject();
}
});
}
}

const file = new searchFile( targets );
file.show();


例ではconsole.logで出すだけでしたが、実際のコードではこの先で DB に INSERT する処理がありました。

Promise.all() で、 Promise を含む配列を引数にすることで、なかの Promise がすべて解決したあとに

実行してくれるので待ち合わせが完成します。

then( results )には、それぞれの Promise の結果が帰ってきているので、

配列を平坦化して処理を進めるようにしました。


まとめ

node.js でファイル操作は難しいですね。

非同期たくさん繋げなきゃいけない場合は、どうしたら綺麗に設計できるのでしょうか。

普段は全くコードを書かないので、設計能力などが皆無で申し訳ないです...


参考

Promise.all()