情報アイランド

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

Node.jsで複数のプロミスを競合させる

2016/09/02

1つのプロミスの完了の待機

複数のプロミスの何れか1つが最初に保留状態から完了状態に変わった後に保留状態から完了状態に変わる新しいプロミスを作成するにはプロミスクラスのrace関数を使用します。

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

  • rsvp.Promiseクラス
  • bluebirdクラス
  • Promiseクラス
var rsvp = require('rsvp');

var p = rsvp.Promise.race([p1, p2, 'xxx']);

第1引数に複数のプロミスを配列として指定します。あるいは、配列以外のイテラブルとして指定することもできます。

あるいは、プロミスを指定する代わりに任意の値を指定することもできます。この場合、プロミスクラスのresolve関数によりこの値を結果とする完了状態のプロミスが作成されます。

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

このプロミスの結果は最初に完了したプロミスの結果になります。

なお、何れか1つのプロミスが保留状態からエラー状態に変わった場合にはこのプロミスも保留状態からエラー状態に変わります

サンプルコード1

promise-race.js

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

var pres1 = new promise(function (resolve, reject) {
    setTimeout(function () {
        util.log('promise resolve 1.');
        resolve('pres1');
    }, 1000);
});
var pres2 = new promise(function (resolve, reject) {
    setTimeout(function () {
        util.log('promise resolve 2.');
        resolve('pres2');
    }, 2000);
});
var pres3 = new promise(function (resolve, reject) {
    setTimeout(function () {
        util.log('promise resolve 3.');
        resolve('pres3');
    }, 3000);
});
var pres4 = new promise(function (resolve, reject) {
    setTimeout(function () {
        util.log('promise resolve 4.');
        resolve('pres4');
    }, 4000);
});

var prej = new promise(function (resolve, reject) {
    setTimeout(function () {
        util.log('promise reject.');
        reject(new Error('prej'));
    }, 500);
});

var ps1 = promise.race([pres1, pres2, pres3, pres4, prej]);
var ps2 = promise.race([pres4, pres3, pres2, pres1]);

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

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

util.log('program started.');

使用パッケージ

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

実行結果

C:\work\node>node promise-race.js
9 Jul 15:40:01 - program started.
9 Jul 15:40:01 - promise reject.
Error: prej
    at Timeout._onTimeout (C:\work\node\promise-race.js:32:10)
    at tryOnTimeout (timers.js:224:11)
    at Timer.listOnTimeout (timers.js:198:5)
9 Jul 15:40:02 - promise resolve 1.
9 Jul 15:40:02 - pres1
9 Jul 15:40:03 - promise resolve 2.
9 Jul 15:40:04 - promise resolve 3.
9 Jul 15:40:05 - promise resolve 4.

関連

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

-Node.js