私のコードには、値が外部関数呼び出しに依存する3つの変数があり、それらはいつでも任意の順序でtrueに設定できるため、フラグのようなものです。
これらの3つの変数がtrueに設定されたときにのみ関数が必要です。
サーバーをブロックせずに、非同期でこれら3つの変数が真になるまで待機するにはどうすればよいですか?
(外部の図書館に紹介されたくない)
私のコードには、値が外部関数呼び出しに依存する3つの変数があり、それらはいつでも任意の順序でtrueに設定できるため、フラグのようなものです。
これらの3つの変数がtrueに設定されたときにのみ関数が必要です。
サーバーをブロックせずに、非同期でこれら3つの変数が真になるまで待機するにはどうすればよいですか?
(外部の図書館に紹介されたくない)
私は通常、このようなことを行うために非同期ライブラリを使用するのが好きですが、このために外部ライブラリを参照したくないためです。変数が設定されているかどうかを確認するために、間隔を置いてチェックする簡単な関数を作成します。
インターバルチェック方式
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.
});
これらの変数の状態を制御する場合-この変数を設定するときにイベントをトリガーしてみませんか?さらに良い-このロジックをカプセル化するオブジェクトがあります。何かのようなもの:
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'
イベントエミッタを使用して実行することもできます。この例では、フォルダーを監視し、次のファイルを待ちます。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)
...