情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

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.

関連

pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-Node.js