情報アイランド

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

Node.jsでプロミスにタイムアウトを付加する

プロミスにタイムアウトを付加するにはp.timeout関数を使用します。

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

  • bluebirdクラス
  • q.Promiseクラス
  • when.promiseクラス
var p = p.timeout(1000, 'xxx');
//or
var p = p.timeout(1000, new Error('xxx'));

第1引数にタイムアウト時間をミリ秒単位で指定します。

第2引数にエラーメッセージかエラーオブジェクトを指定します。この引数は指定しなくても構いません。

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

サンプルコード1

下のコードでは任意時間後に完了状態になるプロミスを作成するためにbluebird.delay関数を使用しています。

bluebird.delay関数に関しては下の記事を参照してください。

bluebird-timeout.js

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

var p1 = bluebird.delay(1000, 1000).timeout('5000', new Error('timeouted 1000ms.'));
var p2 = bluebird.delay(2000, 2000).timeout('4000', new Error('timeouted 2000ms.'));
var p3 = bluebird.delay(3000, 3000).timeout('3000', new Error('timeouted 3000ms.'));
var p4 = bluebird.delay(4000, 4000).timeout('2000', new Error('timeouted 4000ms.'));
var p5 = bluebird.delay(5000, 5000).timeout('1000', new Error('timeouted 5000ms.'));

p1.done(function (result) {
    util.log(result + " ms.");
}, function (err) {
    console.error(err);
});
p2.done(function (result) {
    util.log(result + " ms.");
}, function (err) {
    console.error(err);
});
p3.done(function (result) {
    util.log(result + " ms.");
}, function (err) {
    console.error(err);
});
p4.done(function (result) {
    util.log(result + " ms.");
}, function (err) {
    console.error(err);
});
p5.done(function (result) {
    util.log(result + " ms.");
}, function (err) {
    console.error(err);
});

使用パッケージ

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

実行結果

C:\work\node>node bluebird-timeout.js
14 Aug 16:44:37 - 1000 ms.
Error: timeouted 5000ms.
    at Object.<anonymous> (C:\work\node\bluebird-timeout.js:8:53)
    at Module._compile (module.js:541:32)
    at Object.Module._extensions..js (module.js:550:10)
    at Module.load (module.js:458:32)
    at tryModuleLoad (module.js:417:12)
    at Function.Module._load (module.js:409:3)
    at Function.Module.runMain (module.js:575:10)
    at startup (node.js:160:18)
    at node.js:449:3
Error: timeouted 4000ms.
    at Object.<anonymous> (C:\work\node\bluebird-timeout.js:7:53)
    at Module._compile (module.js:541:32)
    at Object.Module._extensions..js (module.js:550:10)
    at Module.load (module.js:458:32)
    at tryModuleLoad (module.js:417:12)
    at Function.Module._load (module.js:409:3)
    at Function.Module.runMain (module.js:575:10)
    at startup (node.js:160:18)
    at node.js:449:3
14 Aug 16:44:37 - 2000 ms.
Error: timeouted 3000ms.
    at Object.<anonymous> (C:\work\node\bluebird-timeout.js:6:53)
    at Module._compile (module.js:541:32)
    at Object.Module._extensions..js (module.js:550:10)
    at Module.load (module.js:458:32)
    at tryModuleLoad (module.js:417:12)
    at Function.Module._load (module.js:409:3)
    at Function.Module.runMain (module.js:575:10)
    at startup (node.js:160:18)
    at node.js:449:3

関連

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

-Node.js