2012-10-26 86 views
1

在我的代码中,我有三个变量,它们的值依赖于外部函数调用,它们可以在任何时刻以任何顺序设置为true,因此它们更像标志。异步等待条件得到满足

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

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

(我不希望被refered到外部库)

回答

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. 
}); 
2

如果你控制这些变量的状态 - 为什么不是你的时候触发某些事件设置这个变量ES?更好 - 有一些对象包含这个逻辑。就像:

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' 
+0

我在想这样的事情,用get和set,然后我看到了你的答案:D。 –