Javascript 推送时NodeJS数组结果为空
我试图将数据库中的数据推送到数组中,但在这里我遇到了一个小问题,当我尝试Javascript 推送时NodeJS数组结果为空,javascript,node.js,express,Javascript,Node.js,Express,我试图将数据库中的数据推送到数组中,但在这里我遇到了一个小问题,当我尝试console.log时,它显示为空 这是我的密码: var arrTodo =[]; conn.query(todoq,function(err, rows, fields) { rows.forEach(function(detail){ arrTodo.push(detail.name); }); }); console.log(arrTodo); 有人能帮我放吗 试试这个 v
console.log时,它显示为空
这是我的密码:
var arrTodo =[];
conn.query(todoq,function(err, rows, fields) {
rows.forEach(function(detail){
arrTodo.push(detail.name);
});
});
console.log(arrTodo);
有人能帮我放吗 试试这个
var arrTodo =[];
conn.query(todoq,function(err, rows, fields) {
rows.forEach(function(detail){
arrTodo.push(detail.name);
});
console.log(arrTodo);
});
正如注释中提到的,conn.query
是异步的。因此,您提供的回调将在稍后某个时候调用,而您已经在控制台上记录了它
您可以使用承诺来解决您的问题:
function getQuery() {
return new Promise(function (resolve, reject) {
conn.query(todoq,function(err, rows, fields) {
var arrTodo = [];
if (err) {
return reject(err);
}
rows.forEach(function(detail){
arrTodo.push(detail.name);
});
return resolve(arrTodo);
});
});
}
getQuery().then(arrTodo => console.log(arrTodo)).catch(err => console.error(err));
另外,您可以使用arr.map
方法稍微改进代码,如下所示:
function getQuery() {
return new Promise(function (resolve, reject) {
conn.query(todoq,function(err, rows, fields) {
if (err) {
return reject(err);
}
let arrTodo = rows.map(function(detail){
return detail.name;
});
return resolve(arrTodo);
});
});
}
getQuery().then(arrTodo => console.log(arrTodo)).catch(err => console.error(err));
有了承诺,您还可以使用async Wait:
(
async function () {
let arrTodo = await getQuery();
console.log(arrTodo);
}
)()
conn.query
是异步的吗?我猜conn.query
是异步函数。如果要记录结果,请将console.log
移动到forEach
范围中。您必须解释为什么更改会有帮助。问题是什么。最初的问题是一个“新手Javascript 101”类的问题(一个重复的问题,其回答有5047张赞成票),但您的回答有助于指出使用和的潜力。干得好