Mysql 正确使用回调等待查询完成
我试图制作一段可重用的代码,用于查询数据库(带有一些参数),然后对这些数据执行操作并返回一些新创建的数据。我得到的大致情况如下:Mysql 正确使用回调等待查询完成,mysql,node.js,express,callback,Mysql,Node.js,Express,Callback,我试图制作一段可重用的代码,用于查询数据库(带有一些参数),然后对这些数据执行操作并返回一些新创建的数据。我得到的大致情况如下: function loadList(config) { var list = []; var queryString = "SOME QUERY STRING BASED ON THE config PARAMETER"; connection.query(queryString, function (err, result) {
function loadList(config) {
var list = [];
var queryString = "SOME QUERY STRING BASED ON THE config PARAMETER";
connection.query(queryString, function (err, result) {
if err throw err;
for (var i = 0; i < result.length; i++) {
//Perform some action on the data
//IMPORTANT this changes the list variable
}
});
return list;
}
function loadList(config, callback) {
// check that callback is not null
callback = callback || function() {};
var list = [];
var queryString = "SOME QUERY STRING BASED ON THE config PARAMETER";
connection.query(queryString, function(err, result) {
if (err) {
return callback(err);
}
for (var i = 0; i < result.length; i++) {}
// after you done your work call the call back
return callback(null, list);
});
}
函数加载列表(配置){
var列表=[];
var queryString=“基于配置参数的一些查询字符串”;
查询(查询字符串,函数(错误,结果){
如果犯了错误,就扔出错误;
对于(变量i=0;i
现在,这段代码不起作用,该函数在几乎所有情况下都将返回[]
。这是因为返回列表
早在查询回调运行之前就执行了。然而,看在上帝的份上,我不知道如何构造父函数的返回列表
在执行查询和回调之后运行的代码。可能是因为我累了,但我真的看不出解决办法
我曾想过在loadList()
中创建一个新的回调函数,该函数从查询中调用,但如果我从该回调中调用return list
,它将只返回该回调的list
,而不是父函数
正确的实现方法是什么?您应该使用回调基函数,如下所示:
function loadList(config) {
var list = [];
var queryString = "SOME QUERY STRING BASED ON THE config PARAMETER";
connection.query(queryString, function (err, result) {
if err throw err;
for (var i = 0; i < result.length; i++) {
//Perform some action on the data
//IMPORTANT this changes the list variable
}
});
return list;
}
function loadList(config, callback) {
// check that callback is not null
callback = callback || function() {};
var list = [];
var queryString = "SOME QUERY STRING BASED ON THE config PARAMETER";
connection.query(queryString, function(err, result) {
if (err) {
return callback(err);
}
for (var i = 0; i < result.length; i++) {}
// after you done your work call the call back
return callback(null, list);
});
}
您应该使用回调基函数,如下所示:
function loadList(config) {
var list = [];
var queryString = "SOME QUERY STRING BASED ON THE config PARAMETER";
connection.query(queryString, function (err, result) {
if err throw err;
for (var i = 0; i < result.length; i++) {
//Perform some action on the data
//IMPORTANT this changes the list variable
}
});
return list;
}
function loadList(config, callback) {
// check that callback is not null
callback = callback || function() {};
var list = [];
var queryString = "SOME QUERY STRING BASED ON THE config PARAMETER";
connection.query(queryString, function(err, result) {
if (err) {
return callback(err);
}
for (var i = 0; i < result.length; i++) {}
// after you done your work call the call back
return callback(null, list);
});
}
好的,谢谢你的提示。这个回调基函数大致是什么样子的?类似于函数coolCallback(err,list){//code here}?将
err
传递给回调函数背后的想法是什么?编辑:你的编辑让它变得清晰!谢谢在模块中,最好给模块的调用者提供err
,该函数决定如何处理错误、抛出它、打印它等等。我面临同样的问题,但不明白为什么在返回回调中使用“null”作为第一个参数(null,list);好的,谢谢你的提示。这个回调基函数大致是什么样子的?类似于函数coolCallback(err,list){//code here}
?将err
传递给回调函数背后的想法是什么?编辑:你的编辑让它变得清晰!谢谢在模块中,最好给模块的调用者提供err
,该函数决定如何处理错误、抛出它、打印它等等。我面临同样的问题,但不明白为什么在返回回调中使用“null”作为第一个参数(null,list);