4

在我的代码中,我有三个变量,其值取决于外部函数调用,它们可以在任何时候以任何顺序设置为 true,因此,它们更像是标志。

我需要一个函数,只有在这三个变量设置为 true 时才存在。

如何以异步方式等待这三个变量为真,而不阻塞我的服务器?

(我不想被引用到外部库)

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 回答