在我的代码中,我有三个变量,其值取决于外部函数调用,它们可以在任何时候以任何顺序设置为 true,因此,它们更像是标志。
我需要一个函数,只有在这三个变量设置为 true 时才存在。
如何以异步方式等待这三个变量为真,而不阻塞我的服务器?
(我不想被引用到外部库)
在我的代码中,我有三个变量,其值取决于外部函数调用,它们可以在任何时候以任何顺序设置为 true,因此,它们更像是标志。
我需要一个函数,只有在这三个变量设置为 true 时才存在。
如何以异步方式等待这三个变量为真,而不阻塞我的服务器?
(我不想被引用到外部库)
我通常喜欢使用异步库来做这样的事情,但是因为你不想为此引用外部库。我将编写一个简单的函数,它会定期检查变量是否已设置。
间隔检查方法
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)
...