在我的代码中,我有三个变量,其值取决于外部函数调用,它们可以在任何时刻以任何顺序设置为true,因此,它们更像是标志。
只有将这三个变量设置为true,我才需要一个函数。
如何以异步方式执行等待这三个变量的情况,而不会阻塞我的服务器?
(我不想被称为外部图书馆)
答案 0 :(得分:7)
我通常喜欢使用async库来执行此类操作,但因为您不希望将其引用到外部库中。我将编写一个简单的函数,以一定间隔检查它以查看变量是否已设置。
间隔检查方法
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.
});
答案 1 :(得分: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'
答案 2 :(得分:0)
也可以使用事件发射器来完成。在该示例中,我观察一个文件夹并等待以下文件。出于演示目的,也可以使用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)
...