情報アイランド

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

Node.jsで非同期的な処理にタイムアウトを付加する

非同期的な処理にタイムアウトを付加するにはasyncモジュールのasync.timeout関数を使用します。

var f = async.timeout(function (arg1, arg2, callback) {
    callback(null, 'xxx');
    //or
    callback(new Error('yyy'), null);
}, 100);

第1引数に非同期コールバック関数を引数として受け取る関数を指定します。

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

返り値として非同期コールバック関数を引数として受け取る関数にタイムアウトが付加されたものが得られます。

そのため、返り値の関数は下のように呼び出すことができます。

f('xxx', 'yyy', function (err, result) {
});

これにより非同期的な処理の実行が開始されます。

処理がタイムアウトした場合には直後にエラーが発生します。このエラーのエラーオブジェクトのcodeETIMEDOUTとなります。

ただし、処理がタイムアウトしてもエラーが発生するだけで処理自体は続行しますので注意してください。

サンプルコード1

async-timeout.js

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

var f = function (t, callback) {
    util.log('start: ' + t);
    setTimeout(function () {
        util.log('end: ' + t);
        callback(null, t);
    }, t);
};
var af = async.timeout(f, 1000);

var callback = function (err, t) {
    if (err) {
        console.error(err);
    }
    else {
        util.log('callbacked: ' + t);
    }
};
for (var i = 100; i < 2000; i += 200) {
    f(i, callback);
    af(i, callback);
}

使用パッケージ

  • Async.js
    npm install asyncでインストールします。

実行結果

C:\work\node>node async-timeout.js
22 Jun 11:05:34 - start: 100
22 Jun 11:05:34 - start: 100
22 Jun 11:05:34 - start: 300
22 Jun 11:05:34 - start: 300
22 Jun 11:05:34 - start: 500
22 Jun 11:05:34 - start: 500
22 Jun 11:05:34 - start: 700
22 Jun 11:05:34 - start: 700
22 Jun 11:05:34 - start: 900
22 Jun 11:05:34 - start: 900
22 Jun 11:05:34 - start: 1100
22 Jun 11:05:34 - start: 1100
22 Jun 11:05:34 - start: 1300
22 Jun 11:05:34 - start: 1300
22 Jun 11:05:34 - start: 1500
22 Jun 11:05:34 - start: 1500
22 Jun 11:05:34 - start: 1700
22 Jun 11:05:34 - start: 1700
22 Jun 11:05:34 - start: 1900
22 Jun 11:05:34 - start: 1900
22 Jun 11:05:34 - end: 100
22 Jun 11:05:34 - callbacked: 100
22 Jun 11:05:34 - end: 100
22 Jun 11:05:34 - callbacked: 100
22 Jun 11:05:34 - end: 300
22 Jun 11:05:34 - callbacked: 300
22 Jun 11:05:34 - end: 300
22 Jun 11:05:34 - callbacked: 300
22 Jun 11:05:34 - end: 500
22 Jun 11:05:34 - callbacked: 500
22 Jun 11:05:34 - end: 500
22 Jun 11:05:34 - callbacked: 500
22 Jun 11:05:35 - end: 700
22 Jun 11:05:35 - callbacked: 700
22 Jun 11:05:35 - end: 700
22 Jun 11:05:35 - callbacked: 700
22 Jun 11:05:35 - end: 900
22 Jun 11:05:35 - callbacked: 900
22 Jun 11:05:35 - end: 900
22 Jun 11:05:35 - callbacked: 900
{ Error: Callback function "anonymous" timed out.
    at Timeout.timeoutCallback [as _onTimeout] (C:\work\node\node_modules\async\dist\async.js:6225:25)
    at tryOnTimeout (timers.js:224:11)
    at Timer.listOnTimeout (timers.js:198:5) code: 'ETIMEDOUT' }
{ Error: Callback function "anonymous" timed out.
    at Timeout.timeoutCallback [as _onTimeout] (C:\work\node\node_modules\async\dist\async.js:6225:25)
    at tryOnTimeout (timers.js:224:11)
    at Timer.listOnTimeout (timers.js:198:5) code: 'ETIMEDOUT' }
{ Error: Callback function "anonymous" timed out.
    at Timeout.timeoutCallback [as _onTimeout] (C:\work\node\node_modules\async\dist\async.js:6225:25)
    at tryOnTimeout (timers.js:224:11)
    at Timer.listOnTimeout (timers.js:198:5) code: 'ETIMEDOUT' }
{ Error: Callback function "anonymous" timed out.
    at Timeout.timeoutCallback [as _onTimeout] (C:\work\node\node_modules\async\dist\async.js:6225:25)
    at tryOnTimeout (timers.js:224:11)
    at Timer.listOnTimeout (timers.js:198:5) code: 'ETIMEDOUT' }
{ Error: Callback function "anonymous" timed out.
    at Timeout.timeoutCallback [as _onTimeout] (C:\work\node\node_modules\async\dist\async.js:6225:25)
    at tryOnTimeout (timers.js:224:11)
    at Timer.listOnTimeout (timers.js:198:5) code: 'ETIMEDOUT' }
{ Error: Callback function "anonymous" timed out.
    at Timeout.timeoutCallback [as _onTimeout] (C:\work\node\node_modules\async\dist\async.js:6225:25)
    at tryOnTimeout (timers.js:224:11)
    at Timer.listOnTimeout (timers.js:198:5) code: 'ETIMEDOUT' }
{ Error: Callback function "anonymous" timed out.
    at Timeout.timeoutCallback [as _onTimeout] (C:\work\node\node_modules\async\dist\async.js:6225:25)
    at tryOnTimeout (timers.js:224:11)
    at Timer.listOnTimeout (timers.js:198:5) code: 'ETIMEDOUT' }
{ Error: Callback function "anonymous" timed out.
    at Timeout.timeoutCallback [as _onTimeout] (C:\work\node\node_modules\async\dist\async.js:6225:25)
    at tryOnTimeout (timers.js:224:11)
    at Timer.listOnTimeout (timers.js:198:5) code: 'ETIMEDOUT' }
{ Error: Callback function "anonymous" timed out.
    at Timeout.timeoutCallback [as _onTimeout] (C:\work\node\node_modules\async\dist\async.js:6225:25)
    at tryOnTimeout (timers.js:224:11)
    at Timer.listOnTimeout (timers.js:198:5) code: 'ETIMEDOUT' }
22 Jun 11:05:35 - end: 1100
22 Jun 11:05:35 - callbacked: 1100
22 Jun 11:05:35 - end: 1100
22 Jun 11:05:35 - end: 1300
22 Jun 11:05:35 - callbacked: 1300
22 Jun 11:05:35 - end: 1300
22 Jun 11:05:35 - end: 1500
22 Jun 11:05:35 - callbacked: 1500
22 Jun 11:05:35 - end: 1500
22 Jun 11:05:36 - end: 1700
22 Jun 11:05:36 - callbacked: 1700
22 Jun 11:05:36 - end: 1700
22 Jun 11:05:36 - end: 1900
22 Jun 11:05:36 - callbacked: 1900
22 Jun 11:05:36 - end: 1900

関連

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

-Node.js