Javascript Js函数返回未定义
我正在使用Node.js构建一个小型报告工具,我在使用Javascript时面临一些范围界定问题。我正在调用一个函数,它应该从数据库查询返回一个包含城市的数组。这里是函数Javascript Js函数返回未定义,javascript,arrays,function,scope,return,Javascript,Arrays,Function,Scope,Return,我正在使用Node.js构建一个小型报告工具,我在使用Javascript时面临一些范围界定问题。我正在调用一个函数,它应该从数据库查询返回一个包含城市的数组。这里是函数 function queryBuilderZone () { var includedCities = new Array(); q = heredoc(function(){/* SELECT majlis.MajlisId FROM majlis WHERE majl
function queryBuilderZone () {
var includedCities = new Array();
q = heredoc(function(){/*
SELECT majlis.MajlisId
FROM majlis
WHERE majlis.ZoneId = -ZONE-
*/});
q = q.replace(/-ZONE-/g, inZone);
connection.query(q, function(err, rows, fields) {
if (err) throw err;
var rowsLentgh = rows.length;
for (var i = 0; i < rowsLentgh; i++) {
includedCities.unshift(rows[i].MajlisId);
};
console.log(includedCities); // <-- output correct: ['...', '....']
});
connection.end();
console.log(includedCities); // <-- output wrong: []
return includedCities;
}
这是我从主程序打来的电话
includedCities = queryBuilderZone();
console.log(includedCities); // <-- output wrong: []
问题在哪里?为什么此函数不返回数组includedCities中的元素?
并在connection.query的范围内显示正确的预期值
顺便说一下,我正在使用mysql模块构建查询并替换查询中的占位符。这里发生的是返回和回调之间的区别。由于connection.query函数必须伸出手来获取其信息,queryBuilderZone函数在启动后将继续运行,然后得出结论,includedCities是空数组,因为此时它是空数组 您要做的是将回调传递给queryBuilderZone,如下所示
function queryBuilderZone(callback) {
var includedCities = new Array();
q = heredoc(function () {
/*
SELECT majlis.MajlisId
FROM majlis
WHERE majlis.ZoneId = -ZONE-
*/
});
q = q.replace(/-ZONE-/g, inZone);
connection.query(q, function (err, rows, fields) {
if (err) throw err;
var rowsLentgh = rows.length;
for (var i = 0; i < rowsLentgh; i++) {
includedCities.unshift(rows[i].MajlisId);
};
console.log(includedCities); // <-- output correct: ['...', '....']
callback(includedCities);
});
connection.end();
console.log(includedCities); // <-- output wrong: []
// return includedCities; Not needed
}
当你想利用它时,你会这样做
queryBuilderZone(function(includedCities) {
// Do what you'd like here
console.log(includedCities); // <-- output correct: ['...', '....']
});
回调函数中的任何内容都将在connection.query运行并吐出数组后执行 标准异步情况。您的错误控制台日志是否在回调完成之前出现?includeCities是函数的一个局部变量。在我看来,这是一个范围问题。我不是node.js人员,但includeCities是在queryBuilderZone函数中定义的,它不在全局范围内。将其移到函数上方的全局范围内。@rontornambe这是node.js初学者的一个非常典型的问题,他们没有时间阅读一个小教程。谢谢!我不知道回电话的事。因此,我只是想同时学习和解决这个问题。虽然我可以用其他语言解决它。如果您有任何关于回调的好教程,请毫不犹豫地分享: