情報アイランド

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

Node.jsでthenableを作成する

2016/09/02

thenableとは

thenableとはプロミスにおける概念であり、プロミスのthen関数と同じ動作のthen関数を有するオブジェクトのことです。

thenableはプロミスと他の非同期的な処理との相互運用において重要です。

なぜなら、thenableはプロミスに変換することができるからです。

thenableをプロミスに変換するにはプロミスクラスのresolve関数を使用します。

var promise = require('promise');

var p = promise.resolve({
    then: function (resolve, reject) {
        resolve('xxx');
        //or
        resolve(new Promise(function (resolve, reject) {
            //...
        }));
        //or
        reject(new Error('yyy'));
        //or
        throw new Error('zzz');
    }
});

第1引数にthenableを指定します。

返り値としてプロミスが得られます。

また、thenableを作成するにはthenという名称の関数を有するオブジェクトを作成します

この関数はプロミスクラスのコンストラクタの第1引数と同様に実装します。

サンプルコード1

promise-thenable.js

var promise = require('promise');
var util = require('util');

var pres = promise.resolve({
    then: function (resolve, reject) {
        util.log('task 1 start.');
        setTimeout(function () {
            util.log('task 1 complete.');
            resolve('task 1');
        }, 10000);
    }
});

var prej = promise.resolve({
    then: function (resolve, reject) {
        util.log('task 2 start.');
        setTimeout(function () {
            util.log('task 2 complete.');
            reject(new Error('task 2'));
        }, 5000);
    }
});

pres.done(function (result) {
    util.log(result);
}, function (err) {
    console.error(err);
});

prej.done(function (result) {
    util.log(result);
}, function (err) {
    console.error(err);
});

使用パッケージ

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

実行結果

C:\work\node>node promise-thenable.js
9 Jul 16:50:08 - task 1 start.
9 Jul 16:50:08 - task 2 start.
9 Jul 16:50:13 - task 2 complete.
Error: task 2
    at Timeout._onTimeout (C:\work\node\promise-thenable.js:19:11)
    at tryOnTimeout (timers.js:224:11)
    at Timer.listOnTimeout (timers.js:198:5)
9 Jul 16:50:18 - task 1 complete.
9 Jul 16:50:18 - task 1

関連

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

-Node.js