Node.JS函数返回异步回调函数的值

时间:2016-04-16 17:07:49

标签: javascript mysql node.js asynchronous

在Node.JS中,我有一个连接MySQL数据库的函数,得到一堆行,然后将它们作为数组返回。我的问题是使用asynchronous代码,我正在使用async Node.JS模块。

到目前为止,这是我的功能:

var async = require("async")
function get_all_channels_by_order(){
    async.waterfall([
        function(callback){
            mysql_connection.connect()
            mysql_connection.query("SELECT * FROM channels ORDER BY listorder ASC", function(err, result){
                callback(null, result)
            })
        }
    ], function(err, result){
        mysql_connection.end()
        return result
    })
    //return ?? somehow, return the value from the MySQL query?
}
console.log(get_all_channels_by_order())

当调用该函数的行已经检查返回值时,即使它尚未发送,也会出现问题。

如何做到这一点?它甚至可能吗?我意识到我可以不使用这个功能,并在需要时手动执行查询,但最终会完全没有组织和混乱。

我之前问过这个被标记为“Change a variable from outside it's scope”重复的问题“Why is my variable unaltered after I modify it inside of a function? - Asynchronous code reference”,该问题讨论了异步代码,而不是如何让函数从中返回一个值而我无法弄清楚如何。

2 个答案:

答案 0 :(得分:1)

由于它的异步代码您已使用回调来获取数据。

您认为如果使用async套餐,它会帮助您return result吗?

  • 不,你不能。

当您使用许多使用上一个函数结果的函数时,异步软件包有助于摆脱回调地狱。

在您的情况下,您不需要异步。

请阅读或观看有关nodejs异步行为的教程。例如,本教程系列:timeline 03:00 where explains blocking vs non-blocking code

因此,在查询执行后获取数据只有这样:

mysql_connection.connect();

function get_all_channels_by_order(callback){
    mysql_connection.query("SELECT * FROM channels ORDER BY listorder ASC", callback);
}

get_all_channels_by_order(function(err, result) {
  if(err) {
    console.error(err);
    return;
  }

  console.log(result);
});

答案 1 :(得分:0)

我在过去使用NodeJS时遇到了一些问题。 阅读NodeJS Error API之后,它变得更加清晰。

我认为值得一看。

https://nodejs.org/dist/latest-v4.x/docs/api/errors.html