情報アイランド

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

Node.jsで非同期的な処理を複数回試行する

非同期的な処理を複数回試行するにはasyncモジュールのasync.retry関数を使用します。

async.retry関数

var async = require('async');

async.retry({
    times: 5, 
    interval: 0
}, function (callback) {
    callback(null, 'aaa');
    //or
    callback(new Error('bbb'), null);
}, function (err, result) {
});
async.retry(5, function (callback) {
    callback(null, 'aaa');
    //or
    callback(new Error('bbb'), null);
}, function (err, result) {
});

第1引数

第1引数にオプションをオブジェクトとして指定します。この引数は指定しなくても構いません。

主なオプションには下のようなものがあります。

  • times・・・試行回数を指定します。デフォルトは5です。
  • interval・・・試行と試行の間の待機時間をミリ秒単位で指定します。デフォルトは0です。あるいは、待機時間を返す関数を指定することもできます。この関数の第1引数は現在の試行回数です。

あるいは、試行回数のみを直接指定することもできます。

第2引数

第2引数に非同期的な処理を関数として指定します。

この関数の第1引数はコールバック関数です。

処理が完了した場合や処理の実行中にエラーが発生した場合には必ずこのコールバック関数を呼び出さなければなりません。

このコールバック関数の第1引数にはエラーオブジェクト(エラーが発生しなかった場合にはnull)を指定し、第2引数には処理の結果(エラーが発生した場合にはnull)を指定します。

第3引数

第3引数に何れかの試行で非同期的な処理が完了したか、全ての試行で処理の実行中にエラーが発生した場合に呼び出されるコールバック関数を指定します。

この関数の第1引数はエラーオブジェクトであり、第2引数は処理の結果です。

サンプルコード1

async-retry.js

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

var async = require('async');

async.retry({
    times: 10, 
    interval: 1000
}, function (callback) {
    var r = Math.random() * 5;
    util.log(r);
    if (r < 1) {
        callback(null, r);
    }
    else {
        callback(new Error('too large.'), null);
    }
}, function (err, result) {
    console.log(result);
});

使用パッケージ

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

実行結果

C:\work\node>node async-retry.js
21 Jul 09:38:08 - 3.3922591279994982
21 Jul 09:38:09 - 3.917557028605445
21 Jul 09:38:10 - 3.764628231467432
21 Jul 09:38:11 - 2.02576436270303
21 Jul 09:38:12 - 3.783914750535391
21 Jul 09:38:13 - 1.1463729239687903
21 Jul 09:38:14 - 0.043138113855392124
0.043138113855392124

関連

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

-Node.js