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