Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

ジェネレータ関数を同期処理に活かす

shuzo-kino.hateblo.jp
で扱ったジェネレータ関数ですが、ホントは同期的処理で使う子みたいです

実際のところ

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);
});