异步等待满足条件

时间:2012-10-26 18:27:24

标签: node.js asynchronous

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

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

如何以异步方式执行等待这三个变量的情况,而不会阻塞我的服务器?

(我不想被称为外部图书馆)

3 个答案:

答案 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)
     ...