情報アイランド

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

Node.jsで読み込みストリームをプロミスに変換する

2016/09/28

読み込みストリームをプロミスに変換するには

  • 読み込みストリームからのデータの読み込みが完了した時に完了状態に変わり、
  • 読み込みストリームの処理においてエラーが発生した時にエラー状態に変わる

プロミスを作成します。

また、読み込みストリームの全てのデータを纏めて取得するにはconcat-streamモジュールのconcatStream関数を使用します。

また、ストリームの接続とエラー処理を行うにはpumpモジュールのpump関数を使用します。

したがって、読み込みストリームをプロミスに変換する関数は下のように実装することができます。

なお、この関数ではプロミスクラスとしてbluebirdモジュールのbluebirdクラスを使用しています。

var bluebird = require('bluebird');
var concatStream = require('concat-stream');
var pump = require('pump');

function rstream2promise (stream) {
    return new bluebird(function (resolve, reject) {
        pump(stream, concatStream(function (data) {
            resolve(data);
        }), function (err) {
            reject(err);
        });
    });
};

サンプルコード1

3つ目のコマンドライン引数として与えられたテキストファイルのデータをストリームとプロミスを使用して読み込み、標準出力に出力します。

rstream2promise.js

var bluebird = require('bluebird');
var concatStream = require('concat-stream');
var pump = require('pump');
var fs = require('fs');

if (process.argv.length < 3) {
    console.error('lack argument.');
    process.exit(1);
}

rstream2promise(fs.createReadStream(process.argv[2], 'utf-8')).then(function (data) {
    console.log(data);
}).catch(function (err) {
    console.error(err);
    process.exit(1);
});

function rstream2promise (stream) {
    return new bluebird(function (resolve, reject) {
        pump(stream, concatStream(function (data) {
            resolve(data);
        }), function (err) {
            reject(err);
        });
    });
};

使用パッケージ

  • Bluebird
    npm install bluebirdでインストールします。
  • concat-stream
    npm install concat-streamでインストールします。
  • pump
    npm install pumpでインストールします。

実行結果

現在のフォルダにはtextfile.txtという名称のテキストファイルが存在しています(文字コードはUTF-8です)。

C:\work\node>type textfile.txt
これはテキストファイルの内容です。

このテキストファイルを3つ目のコマンドライン引数に指定してコードを実行すると正しく内容が出力されます。

C:\work\node>node rstream2promise.js textfile.txt
これはテキストファイルの内容です。

関連

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

-Node.js