Node.jsで複数のプロミスを競合させる
2016/09/02
プロミスとは?
プロミスとは プロミスとは非同期的な処理を表すオブジェクトです。 非同期的な処理を表す古典的な方法には非同期コールバック関数がありました。あるいは、非同期イベントがありました。 非同期コールバック関数とは?非同期イベントとは?Node.jsにおける非同期的な処理の表現Node
1つのプロミスの完了の待機
複数のプロミスの何れか1つが最初に保留状態から完了状態に変わった後に保留状態から完了状態に変わる新しいプロミスを作成するにはプロミスクラスのrace
関数を使用します。
race
関数は下のプロミスクラスで提供されています。
rsvp.Promise
クラスbluebird
クラスPromise
クラス
var rsvp = require('rsvp');
var p = rsvp.Promise.race([p1, p2, 'xxx']);
第1引数に複数のプロミスを配列として指定します。あるいは、配列以外のイテラブルとして指定することもできます。
イテラブルとは?
ECMAScript 6でイテラブルという新しい概念が導入されました。 イテラブルとは 一般的にイテラブルとは1つずつ要素を取得することができるもののことであり、ECMAScriptではSymbol
あるいは、プロミスを指定する代わりに任意の値を指定することもできます。この場合、プロミスクラスの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.
関連

スポンサーリンク