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

标签 javascript mysql node.js asynchronous

在 Node.JS 中,我有一个函数可以连接 MySQL 数据库,获取一堆行,然后将它们作为数组返回。我的问题是异步代码,我正在使用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 的重复项',这个问题讨论的是异步代码,而不是如何让函数从中返回值,我不知道如何实现。

最佳答案

由于它是异步代码,您必须使用回调来获取数据。

您认为如果您使用async包,它会帮助您返回结果

  • 不,你不能。

当您有许多函数使用前一个函数的结果时,异步包有助于摆脱回调 hell 。

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

请阅读或观看有关 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);
});

关于javascript - Node.JS 函数返回异步回调函数的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36667143/

相关文章:

javascript - JavaScript 中更好的随机函数

MySQL:遍历一个表并更新另一个表?

c# - ASP.NET - 使用字符串 ID 和 2 个键查询表

mysql - 如何向现有数据添加逗号

node.js - 单元测试环回模型

node.js - GCP - Compute Engine to Storage per group/user access ACL with custom Auth system

javascript - Express 服务器中语言子域的最佳实践?

javascript - 测试可观察回调以更改对象状态

javascript - ReactJS:将状态值设置为数组的正确方法是什么?

javascript - 第一次尝试加载ajax数据时javascript的奇怪行为