動かざることバグの如し

近づきたいよ 君の理想に

Nodejsでも同期したい人生だった

一般的なコード(非同期)

var fs = require('fs');
console.log(1);
fs.readFile('first_promise.js', 'utf8', function (err, text) {
    console.log(2);
    console.log(text);
    console.log(3);
});
console.log(4);

実行結果

1
4
2
var fs = require('fs');
console.log(1);
fs.readFile('first_promise.js', 'utf8', function (err, text) {
        console.log(2);
        console.log(text);
        console.log(3);
});
console.log(4);

3

なるほど非同期だ

bluebirdを使う

bluebirdモジュールのインストール

npm install bluebird
var fs = require('fs');
var Promise = require('bluebird');
console.log(1);
Promise.promisifyAll(fs);
console.log(2);
fs.readFileAsync('first_promise.js', 'utf-8').then(function(value) {
    console.log(3);
  console.log(value);
    console.log(4);
}, function(error) {
  console.error(error);
});

実行結果

1
2
3
var fs = require('fs');
var Promise = require('bluebird');
console.log(1);
Promise.promisifyAll(fs);
console.log(2);
fs.readFileAsync('first_promise.js', 'utf-8').then(function(value) {
        console.log(3);
  console.log(value);
        console.log(4);
}, function(error) {
  console.error(error);
});

4

どうなっているの

  • fsモジュールとbluebirdモジュールをrequireで読み込み
  • Promise.promisifyAllを実行し、fsモジュールの全メソッドをPromise対応させる
  • fs.readFileAsync
    • readFileAsyncメソッドはPromise.promisifyAllがfsモジュールに追加した、Promise対応版のreadFileメソッド
    • Promise.promisifyAllは*Asyncという名前でPromise対応版メソッドをモジュールに追加
  • readFileAsyncが返すPromiseオブジェクトの.then()を使用し非同期処理終了後に実行されるコールバック処理を登録します。つまり.then()に非同期処理が完了した後に実行すべき処理を記述