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
関連

スポンサーリンク