在异步竞赛中使用第一个结果/ Winner接受所有竞赛

时间:2013-05-30 17:43:56

标签: node.js asynchronous race-condition

基本上,我想对彼此进行两次异步调用,只使用获胜者。

我似乎无法弄清楚如何做到这一点,只是如何防止它。可以远程进行吗?

Lame伪代码:

//rigging a race
function MysqlUser()
{
        setTimeout(function(){
                return "mysqluser";
        }, 500);
}

function ADUser()
{
        setTimeout(function(){
                return "aduser";
        }, 1000);
}

function getUser()
{
        var user = null;
        user = ADBind();
        user = MysqlBind();
        //if user != null
        return user;
        //else?
}

我希望(在这个例子中)让MysqlUser赢得ADUser。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

你可以编写一个简单的first函数来获取任务列表并回调,结果只有第一个完成:

function first(tasks, cb) {
    var done = false;
    tasks.forEach(function(task) {
        task(function(result) {
            if(done) return;
            done = true;
            cb(result);
        });                   
    });
}

然后:

function mysqlUser(cb) {
        setTimeout(function() {
                cb("mysqluser");
        }, 500);
}

function adUser(cb) {
        setTimeout(function() {
                cb("aduser");
        }, 1000);
}


first([mysqlUser, adUser], function(user) {
    console.log(user);
});

如果您想要应对两种操作失败,可能需要更多考虑。