情報アイランド

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

Node.jsで非同期的な処理を同期的な条件付きで繰り返し実行する

非同期的な処理を同期的な条件付きで繰り返し実行するにはasyncモジュールの下のような関数を使用します。

  • async.whilst関数
  • async.doWhilst関数
  • async.until関数
  • async.doUntil関数

async.whilst関数

繰り返しの条件が満たされているか同期的にチェックし、満たされている場合には非同期的な処理を実行します。

これを条件が満たされなくなるまで繰り返します。

var async = require('async');

async.whilst(function () {
    return true;
    //or
    return false;
}, function (callback) {
    callback(null, 'xxx');
    //or
    callback(new Error('yyy'), null);
}, function (err, result) {
});

第1引数

第1引数に繰り返しの条件を関数として指定します。

この関数では繰り返しの条件を満たすかどうかを真偽値として返すようにします。

第2引数

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

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

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

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

第3引数

第3引数に繰り返しの条件を満たさなくなったか、処理の実行中にエラーが発生した場合に呼び出されるコールバック関数を指定します。

この関数の第1引数はエラーオブジェクトであり、第2引数は処理を最後に実行した際の結果です。

この引数は指定しなくても構いません。

async.doWhilst関数

async.doWhilst(function (callback) {
    callback(null, 'xxx');
    //or
    callback(new Error('yyy'), null);
}, function () {
    return true;
    //or
    return false;
}, function (err, result) {
});

繰り返しの条件が満たされているかのチェックと非同期的な処理の実行の順序が逆になるという点以外はasync.whilst関数と同じです。

ただし、第1引数と第2引数の順序がasync.whilst関数とは逆転します。

async.until関数

async.until(function () {
    return true;
    //or
    return false;
}, function (callback) {
    callback(null, 'xxx');
    //or
    callback(new Error('yyy'), null);
}, function (err, result) {
});

繰り返しの条件が満たされていない場合に非同期的な処理を実行するという点以外はasync.whilst関数と同じです。

async.doUntil関数

async.doUntil(function (callback) {
    callback(null, 'xxx');
    //or
    callback(new Error('yyy'), null);
}, function () {
    return true;
    //or
    return false;
}, function (err, result) {
});

繰り返しの条件が満たされているかのチェックと非同期的な処理の実行の順序が逆になるという点以外はasync.until関数と同じです。

ただし、第1引数と第2引数の順序がasync.until関数とは逆転します。

サンプルコード1

async.whilst関数の使用例です。

async-whilst.js

var async = require('async');

var r = 0;
var a = 0;
async.whilst(function () {
    return a < 100;
}, function (callback) {
    r++;
    a = r * r * Math.PI;
    callback(null);
}, function (err, results) {
    if (err) {
        console.error(err);
        process.exit(1);
    }
    else {
        console.log('r = ' + r + ', a = ' + a);
    }
});

使用パッケージ

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

実行結果

C:\work\node>node async-whilst.js
r = 6, a = 113.09733552923255

関連

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

-Node.js