我正在尝试制作一段可重用的代码来查询数据库(带有一些参数),然后对此数据执行操作并返回一些新创建的数据。我大致看起来像这样:
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;
}
现在,这段代码不起作用,该函数几乎在每种情况下都会返回[]
。这是因为return list
早在查询的回调运行之前就已执行。但是,出于上帝的爱,我无法弄清楚如何构建我的代码,父函数的return list
在查询和回调都执行后运行。可能是因为我累了,但我真的看不到解决方案。
我想过在loadList()
中创建一个从查询中调用的新回调函数,但是如果我从该回调中调用return list
,它只会返回该回调的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);
});
}
用法:
loadList(config_here, function(err, list) {
if (err) {
// do something with err
}
// here you have the list
})