node如何得到正确的返回值
下面的代码,返回到客户端的json数组总是空,执行后也是在控制台先输出2,后输出1,明明findData(id)在前,为什么先输出了2,而不是先输出findData里的1
var findTalk = function(id){
connection.query('SELECT id,content,date,userimg,username FROM talk'+id, function(err, rows, fields) {
if (err)
throw err;
if (rows) {
for (var i = 0; i < rows.length; i++) {
var talk = {
id: 0,
content: "",
date: '',
userimg: '',
username: ''
};
talk.id = rows[i].id;
talk.content = rows[i].content;
talk.date = rows[i].date.toString().substr(0, 21);
talk.userimg = rows[i].userimg;
talk.username = rows[i].username;
talks.push(talk);
}
console.log('1');
}
});
};
app.get('/talk/', function(req, res) {
var id = req.query.id;
findTalk(id);
for (var i = 0; i < talks.length; i++) {
json[i] = talks[i];
}
console.log('2');
res.send(json);
});
query是异步执行的,这个和ajax异步查询一个意思,要用回调的形式来获取查询返回,要不talks永远得不到正确的查询返回值
var findTalk = function (id,callback) {///////////////
connection.query('SELECT id,content,date,userimg,username FROM talk' + id, function (err, rows, fields) {
if (err)
throw err;
if (rows) {
for (var i = 0; i < rows.length; i++) {
var talk = {
id: 0,
content: "",
date: '',
userimg: '',
username: ''
};
talk.id = rows[i].id;
talk.content = rows[i].content;
talk.date = rows[i].date.toString().substr(0, 21);
talk.userimg = rows[i].userimg;
talk.username = rows[i].username;
talks.push(talk);
}
console.log('1');
callback()///////////
}
});
};
app.get('/talk/', function (req, res) {
var id = req.query.id;
findTalk(id, function () {//////////////
for (var i = 0; i < talks.length; i++) {
json[i] = talks[i];
}
console.log('2');
res.send(json);
});
});
建议使用 async / await 处理这种异步问题更优雅一点。
const findTalk = function (id) {
return new Promise((resolve, reject) => {
connection.query(`SELECT id,content,date,userimg,username FROM talk${id}`, (err, rows, fields) => {
if (err) reject(err);
if (rows) {
for (let i = 0; i < rows.length; i++) {
const talk = {
id: 0,
content: "",
date: "",
userimg: "",
username: "",
};
talk.id = rows[i].id;
talk.content = rows[i].content;
talk.date = rows[i].date.toString().substr(0, 21);
talk.userimg = rows[i].userimg;
talk.username = rows[i].username;
talks.push(talk);
}
console.log("1");
resolve();
}
});
});
};
app.get("/talk/", async (req, res) => {
const id = req.query.id;
try {
await findTalk(id);
} catch (err) {
console.log(err);
}
for (let i = 0; i < talks.length; i++) {
json[i] = talks[i];
}
console.log("2");
res.send(json);
});
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!