shuzo-kino.hateblo.jpで扱ったジェネレータ関数ですが、ホントは非同期的処理で使う子みたいです
非同期的処理というと前の記事でやった「co」ライブラリが思いつきますが……こっちの方がより現代的……らしい
実際のところ
bluebirdというライブラリを活用しつつ、ファイルの上書き処理をするものを考えます。
'use strict'; const Promise = require('bluebird'); const fs = Promise.promisifyAll(require('fs')); const ary = [1,2,3]; // 実行 const exec = function*() { let input = yield fs.readFileAsync('input.txt', 'utf-8'); let output = input; for (let i of ary) { output += (i * 4) + '\n'; } yield fs.writeFileAsync('input.txt', output); input = yield fs.readFileAsync('input.txt', 'utf-8'); console.log(input); }; Promise.coroutine(exec)().catch((err) => { console.log(err); });
これをジェネレータナシで書くと、こんな感じ。
Rubyでいうメソッドチェインみたいな感じですね。
'use strict'; const Promise = require('bluebird'); const fs = Promise.promisifyAll(require('fs')); const ary = [1,2,3]; fs.readFileAsync('input.txt', 'utf-8') .then((text) => { let output = text; for (let i of ary) { output += (i * 4) + '\n'; } return fs.writeFileAsync('input.txt', output); }) .then(() => { return fs.readFileAsync('input.txt', 'utf-8'); }) .then((text) => { console.log(text); }) .catch((err) => { console.log(err); });