読者です 読者をやめる 読者になる 読者になる

Bye Bye Moore

猫マンション建築の野望を胸に零細事業主として資本主義の荒波に漕ぎ出したアラサー男の技術メモ

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

javascript/node.js

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