Node.jsでプロミスを使って非同期的なusingパターンを実現する
目次
プロミスとは?
プロミスを使って非同期的なusingパターンを実現するにはbluebird
モジュールのbluebird
プロミスクラスのp.disposer
関数とbluebird.using
関数を使用します。
usingパターンとは
usingパターンとはオブジェクトの使用後にオブジェクトに対する後処理が必ず行われることを保証するためのパターンです。
オブジェクトに対して後処理を登録し、オブジェクトの使用時に後処理が行われなければならないことを明示することによって実現します。
非同期的なusingパターンとはusingパターンの中でも非同期的なものを言います。
bluebird
モジュールの場合、後処理が必要なオブジェクトをプロミスの結果としてプロミスに格納し(プロミスでラップし)、爾後はプロミスに対して所望の操作を行います。
非同期的なusingパターンの実現
p.disposer関数
オブジェクトに対して後処理を登録するにはオブジェクトを格納しているプロミスのdisposer
関数を使用します。
var bluebird = require('bluebird');
var d = p.disposer(function (resource, p) {
});
第1引数に後処理を関数として指定します。この関数の第1引数はプロミスが格納しているオブジェクトであり、第2引数はプロミスです。
返り値としてbluebird.using
関数に渡すことのできる特別なオブジェクトが得られます。
bluebird.using関数
オブジェクトの使用時に後処理が行われなければならないことを明示するにはbluebird.using
関数を使用します。
var p = bluebird.using(d1, d2, function (resource1, resource2) {
});
第1引数以降にp.disposer
関数の返り値である特別なオブジェクトを指定します。
最後の引数にオブジェクトに対する処理を関数として指定します。この関数の第1引数以降はプロミスが格納しているオブジェクトです。
返り値としてプロミスが得られます。
このプロミスはオブジェクトに対する処理が実行され、オブジェクトに対して登録された後処理が実行された後に保留状態から完了状態に変わります。
サンプルコード1
bluebird-using.js
var bluebird = require('bluebird');
var o1 = {
open: function () {
console.log('o1 is opened.');
},
close: function () {
console.log('o1 is closed.');
},
value: 100
};
var o2 = {
open: function () {
console.log('o2 is opened.');
},
close: function () {
console.log('o2 is closed.');
},
value: 200
};
var p1 = bluebird.resolve(o1).then(function (o1) {
o1.open();
return o1;
});
var p2 = bluebird.resolve(o2).then(function (o2) {
o2.open();
return o2;
});
var d1 = p1.disposer(function (o1, p) {
o1.close();
});
var d2 = p2.disposer(function (o2, p) {
o2.close();
});
var p = bluebird.using(d1, d2, function (o1, o2) {
console.log(o1.value);
console.log(o2.value);
});
p.done(function (__) {
console.log('end.');
}, function (err) {
console.error(err);
process.exit(1);
});
使用パッケージ
- Bluebird
npm install bluebird
でインストールします。
実行結果
C:\work\node>node bluebird-using.js
o1 is opened.
o2 is opened.
100
200
o1 is closed.
o2 is closed.
end.
関連
