1

基本上,我想将两个异步调用相互对抗,并且只使用获胜者。

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

蹩脚的伪代码:

//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。

任何帮助,将不胜感激。

4

1 回答 1

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

如果您想处理两个操作都失败,这可能需要更多考虑。

于 2013-05-30T21:49:09.640 回答