我正在使用Node.js构建一个小型报告工具,我正面临一些Javascript的范围问题。我正在调用一个函数,它应该从数据库查询中返回一个包含城市的数组。这里的功能。
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
模块构建查询并替换查询中的占位符。
答案 0 :(得分:3)
这里发生的是返回和回调之间的区别。由于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
运行之后执行,并吐出数组。