4

私のコードには、値が外部関数呼び出しに依存する3つの変数があり、それらはいつでも任意の順序でtrueに設定できるため、フラグのようなものです。

これらの3つの変数がtrueに設定されたときにのみ関数が必要です。

サーバーをブロックせずに、非同期でこれら3つの変数が真になるまで待機するにはどうすればよいですか?

(外部の図書館に紹介されたくない)

4

3 に答える 3

8

私は通常、このようなことを行うために非同期ライブラリを使用するのが好きですが、このために外部ライブラリを参照したくないためです。変数が設定されているかどうかを確認するために、間隔を置いてチェックする簡単な関数を作成します。


インターバルチェック方式

var _flagCheck = setInterval(function() {
    if (flag1 === true && flag2 === true && flag3 === true) {
        clearInterval(_flagCheck);
        theCallback(); // the function to run once all flags are true
    }
}, 100); // interval set at 100 milliseconds

非同期ライブラリ並列メソッド

var async = require('async');

async.parallel([
    function(callback) {
        // handle flag 1 processing
        callback(null);
    },

    function(callback) {
        // handle flag 2 processing
        callback(null);
    },

    function(callback) {
        // handle flag 3 processing
        callback(null);
    },
], function(err) {
    // all tasks have completed, run any post-processing.
});
于 2012-10-26T18:53:30.283 に答える
2

これらの変数の状態を制御する場合-この変数を設定するときにイベントをトリガーしてみませんか?さらに良い-このロジックをカプセル化するオブジェクトがあります。何かのようなもの:

function StateChecker(callback) {
    var obj = this;
    ['a', 'b', 'c'].forEach(function (variable) {
        Object.defineProperty(obj, variable, {
            get: function () { return a; }
            set: function (v) { values[variable] = v; check(); }
        });
    });
    function check() {
        if (a && b && c) callback();
    }
}

var checker = new StateChecker(function () {
    console.log('all true');
});

checker.a = true;
checker.b = true;
checker.c = true;
> 'all true'
于 2012-10-26T21:22:55.900 に答える
1

イベントエミッタを使用して実行することもできます。この例では、フォルダーを監視し、次のファイルを待ちます。setTimeoutデモ目的で使用することもできます。

const counterEmitter = new EventEmitter();

// wait for the second file before processing the first file
let globalCounter = 0;
chokidar.watch(process.env.WATCH).on('add', (filePath) => {

     globalCounter++;
     const counter = globalCounter;        
     counterEmitter.once('counterEvent', (counterEvent) => {
         console.log('counterEvent', counterEvent);
         if (counter < counterEvent) {
              console.log("I waited", counter)
         }
     });
     counterEmitter.emit('counterEvent', globalCounter)
     ...
于 2019-09-24T13:14:07.243 に答える