节点 - 如何确保在异步环境中完成所有操作

时间:2013-07-28 16:52:55

标签: mysql node.js asynchronous

我不是编程新手,但我正在进入Node.JS.我理解阻塞与非阻塞操作。我知道将东西推向非阻塞是Good Thing™。我想要了解的是如何确定,如果我异步推送,我怎样才能确保程序在继续处理/返回之前收集了来自所有不同请求的所有数据?

以下是使用node-mysql的示例代码。为了争论,它可以是任何东西(Mongo,MySQL,文件读取,http请求等),因为我意识到mysql模块具有并行化的能力。

function getUserInfo(userID, myDB){
    var users, profile, login;

    // Get all of the account data
    myDB.query("SELECT * FROM `users` WHERE `id`='"+userID+"' LIMIT 0,1", function(err, row){
        users = JSON.stringify(row);
    }

    // Get all of the profile data
    myDB.query("SELECT * FROM `profile` WHERE `id`='"+userID+"' LIMIT 0,1", function(err, row){
        profile = JSON.stringify(row);
    }

    // Find their last logged in IP
    myDB.query("SELECT `ip`,`date` FROM `login` WHERE `userid`='"+userID+"' ORDER BY DESC LIMIT 0,1", function(err, row){
        login = JSON.stringify(row);
    }

    // Do some other processing here... Once all mysql is done.

    return(users, profile, login);
}

这里的答案只是将所有这些调用转储到Async.js并将其称为一天吗?

1 个答案:

答案 0 :(得分:1)

是的,如果你需要同时做几件事,诺言库可以很好地帮助实现。此外,您不能简单地在此功能的末尾return。您需要接受回调(除非您的函数返回自己的承诺),然后在完成查询后调用该回调。返回此函数很久就会发生对MySQL的回调。

最后,使用参数化查询来避免SQL注入攻击。