Javascript 如何使用Node/JS从异步回调方法正确地获取数据?

Javascript 如何使用Node/JS从异步回调方法正确地获取数据?,javascript,sql,node.js,express,asynchronous,Javascript,Sql,Node.js,Express,Asynchronous,如果这个问题被问了一百遍,我真的很抱歉,但我还不能适应以前的任何解决方案,所以我找到了我的问题。其中很多是特定于Ajax的 我不熟悉Node的异步回调,因此我在从异步回调正确地“返回”数据方面遇到了问题。在我的示例中,我试图返回CharList。SQL查询和数据都是有效的,因此它们并不太重要 我尝试过简单地返回值,但很快我就知道这是不可能的,并且违背了异步回调的目的 编辑:我还尝试在函数外部定义CharList,然后通过函数分配值,但是在函数完成后记录CharList会打印一个空数组 // in

如果这个问题被问了一百遍,我真的很抱歉,但我还不能适应以前的任何解决方案,所以我找到了我的问题。其中很多是特定于Ajax的

我不熟悉Node的异步回调,因此我在从异步回调正确地“返回”数据方面遇到了问题。在我的示例中,我试图返回
CharList
。SQL查询和数据都是有效的,因此它们并不太重要

我尝试过简单地返回值,但很快我就知道这是不可能的,并且违背了异步回调的目的

编辑:我还尝试在函数外部定义
CharList
,然后通过函数分配值,但是在函数完成后记录
CharList
会打印一个空数组

// index.js
const sql = require('./sql')
const query = require('./queries');

function AllCharsToArray() {
    query.character.GetAllChars(function(result) {
        let CharList = [];
        for (var i in result) {
            CharList.push(result[i]._Name)
        }
    })
}

/*
{
    "characters":
    [
        {"_Name":"Charname 1"},
        {"_Name":"Charname 2"},
        {"_Name":"Charname 3"}
    ]
}
*/

最后,我试图让
CharList
AllCharsToArray
之外可用,以便将它们导出到express.js路由。

将CharList放置在AllCharsToArray()之外


建议的回调函数包含错误消息,如

// queries.js
const mysql = require('mysql');
const sql = require('./sql')

function GetAllChars(callback) {
    sql.conn.query(`SELECT _Name FROM characters;`, function(error, results, fields) {
        // change as
        if(error) {
            return callback(error)
        }
        callback(null,results); // returns RowDataPacket
    })
}

exports.character = {
    GetAllChars: GetAllChars,
}
关于index.js

...
function(req,res){
    query.character.GetAllChars(function(err,data){
       // check error info
       if(err){
          // console.debug(err)
          return res.send(err.message)
       }
       res.json(data)
    })
}
...


我尝试过这样做,但在函数完成后尝试记录
字符列表
会导致空数组,正如定义的那样。如果要使用回调方式,请检查我编辑的帖子。或者你可以研究异步/等待方式。以前的解决方案不是特定于ajax的,而是特定于异步的。你的问题被标记为重复的。它有你需要的所有细节。您需要通过回调或承诺将异步操作的结果传回。挑一个或另一个。在非阻塞异步操作完成之前,函数返回。从回调中返回只是返回到数据库回调函数中——包含该函数的函数早就没有返回任何内容了。请记住,
return
仅适用于立即函数作用域。这是一种方法。查看这个问题的答案,这个问题被标记为重复的,以获得更多的解释和其他选项(如承诺)。@Xiaoyiyu您可以添加一些关于代码工作原理的解释吗。提交者的代码中必须修复/更改的内容是什么?这将在每个客户端请求上调用GetAllChars。@LéaGris在代码中,返回回调函数的定义和当前定义的错误消息,以确定它是否是最终调用中的错误,导致回调函数调用fail@RexHsu这是一个简单的例子,可以放在任何地方,对不起,代码描述太简单了。
// queries.js
const mysql = require('mysql');
const sql = require('./sql')

function GetAllChars(callback) {
    sql.conn.query(`SELECT _Name FROM characters;`, function(error, results, fields) {
        // change as
        if(error) {
            return callback(error)
        }
        callback(null,results); // returns RowDataPacket
    })
}

exports.character = {
    GetAllChars: GetAllChars,
}
...
function(req,res){
    query.character.GetAllChars(function(err,data){
       // check error info
       if(err){
          // console.debug(err)
          return res.send(err.message)
       }
       res.json(data)
    })
}
...