情報アイランド

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

Node.jsでプロミスを非同期コールバック関数を引数として受け取る関数に変換する

プロミスを非同期コールバック関数を引数として受け取る関数に変換するにはp.nodeify関数を使用します。

p.nodeify関数は下のプロミスクラスで提供されています。

  • promiseクラス
  • bluebirdクラス
  • q.Promiseクラス
p.nodeify(function (err, result) {
});

第1引数に非同期コールバック関数を指定します。この関数の第1引数はエラーオブジェクトであり、第2引数はプロミスの結果です。

プロミスが保留状態から完了状態やエラー状態に変わった時にこの関数が呼び出されます。

そのため、下のようなコードを記述すればプロミスpを非同期コールバック関数を引数として受け取る関数fに変換することができます。

function f (callback) {
    p.nodeify(callback);
}

サンプルコード1

promise-nodeify.js

var promise = require('promise');

var p = new promise(function (resolve, reject) {
    var n = Number(process.argv[2]);
    if (n || n === 0) {
        resolve(n);
    }
    else {
        throw new Error('not a number.');
    }
});

var pt1 = p.then(function (result) {
    if (result % 2 === 0) {
        return result / 2;
    }
    else {
        throw new Error('not divisible by 2.');
    }
});

var pt2 = pt1.then(function (result) {
    if (result % 3 === 0) {
        return result / 3;
    }
    else {
        throw new Error('not divisible by 3.');
    }
});

function f (callback) {
    pt2.nodeify(callback);
}

f(function (err, result) {
    if (err) {
        console.error(err);
        process.exit(1);
    }
    else {
        console.log('result is ' + result + '.');
    }
});

使用パッケージ

  • promise
    npm install promiseでインストールします。

実行結果

C:\work\node>node promise-nodeify.js 0
result is 0.

C:\work\node>node promise-nodeify.js 2
Error: not divisible by 3.
    at C:\work\node\promise-nodeify.js:27:9
    at tryCallOne (C:\work\node\node_modules\promise\lib\core.js:37:12)
    at C:\work\node\node_modules\promise\lib\core.js:123:15
    at flush (C:\work\node\node_modules\asap\raw.js:50:29)
    at _combinedTickCallback (internal/process/next_tick.js:67:7)
    at process._tickCallback (internal/process/next_tick.js:98:9)
    at Function.Module.runMain (module.js:577:11)
    at startup (node.js:159:18)
    at node.js:444:3

C:\work\node>node promise-nodeify.js 3
Error: not divisible by 2.
    at C:\work\node\promise-nodeify.js:18:9
    at tryCallOne (C:\work\node\node_modules\promise\lib\core.js:37:12)
    at C:\work\node\node_modules\promise\lib\core.js:123:15
    at flush (C:\work\node\node_modules\asap\raw.js:50:29)
    at _combinedTickCallback (internal/process/next_tick.js:67:7)
    at process._tickCallback (internal/process/next_tick.js:98:9)
    at Function.Module.runMain (module.js:577:11)
    at startup (node.js:159:18)
    at node.js:444:3

C:\work\node>node promise-nodeify.js 6
result is 1.

関連

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

-Node.js