Javascript 为什么在同一块中得到不同的数组值?
我正在使用node.js作为我的应用程序的api。 问题是在这段代码中,我正在编辑forEach循环中数组的值,但当我console.log()它们时,我仍然得到空数组。 我认为forEach循环是在位置2的console.log()之后以及在发送响应之后执行的。 记录在案,在位置1,我得到了我想要的正确值 这是密码Javascript 为什么在同一块中得到不同的数组值?,javascript,arrays,node.js,api,foreach,Javascript,Arrays,Node.js,Api,Foreach,我正在使用node.js作为我的应用程序的api。 问题是在这段代码中,我正在编辑forEach循环中数组的值,但当我console.log()它们时,我仍然得到空数组。 我认为forEach循环是在位置2的console.log()之后以及在发送响应之后执行的。 记录在案,在位置1,我得到了我想要的正确值 这是密码 router.post('/', (req, res, next) => { userId = req.body.userId; sqlQuery = `S
router.post('/', (req, res, next) => {
userId = req.body.userId;
sqlQuery = `SELECT mealsids FROM tmporders WHERE userid = ${userId}`;
con.query(sqlQuery, function (err, rows) {
let mealsIds = [];
let mealsNames = [];
let mealsPrices = [];
let mealsImages = [];
var index = 0
if (rows['rows'].length > 0) {
mealsIds = rows['rows'];
mealsIds[0]['mealsids'].forEach((row) => {
sqlQuery2 = `SELECT name, image, price FROM meals WHERE id = ${mealsIds[0]['mealsids'][index]}`;
con.query(sqlQuery2, function (err, rows) {
if (err) {
console.log('Failed BITCH');
res.sendStatus(202)
} else {
mealsNames.push(rows['rows'][0]['name']);
mealsPrices.push(rows['rows'][0]['price']);
mealsImages.push(rows['rows'][0]['image']);
/* POSITION 1 */
console.log('============POSITION 1============');
console.log(mealsNames);
console.log(mealsPrices);
console.log(mealsImages);
/* END OF POSITION 1 */
}
});
});
/* POSITION 2 */
console.log('============POSITION 2============');
console.log(mealsNames);
console.log(mealsPrices);
console.log(mealsImages);
/* END OF POSITION 2 */
res.json({
statusCode: 201,
count: mealsNames.length,
mealsIds: mealsIds,
mealsNames: mealsNames,
mealsImages: mealsImages,
mealsPrices: mealsPrices
})
} else {
console.error("Failure");
console.log(err);
res.sendStatus(202);
}
});
});
有什么方法可以修复这个逻辑错误吗?试试这个,它可能会使代码出错,但是您仍然可以按照这个模式更好地开发代码
constquery=conn=>Query=>newpromise((解析,拒绝)=>{
试一试{
conn.query(query,(err,res)=>{
如果(错误)返回拒绝(错误)
解析(res.rows)
})
}捕获(er){
拒绝(er)
}
})
router.post('/',异步(req,res,next)=>{
试一试{
常量查询=查询(con);
userId=req.body.userId;
const rows=wait查询(`SELECT mealsid FROM tmporders,其中userid=${userid}`)
如果(!rows.length){
返回res.status(202).json({
消息:“0行”
})
}
console.log({rows})
mealsIds=rows.rows;
console.log({mealsIds})
const-fines=wait-mealsIds[0]。mealsIds.reduce((promise,e)=>promise.then(async-acc=>{
const currentResult=wait query(`SELECT name,image,price FROM founds,其中id=${mealsIds[0]。mealsIds[0]}`)
返回acc.concat(当前结果[0])
}),Promise.resolve([]))
console.log({founds})
res.status(200).json({
餐
})
}捕捉(错误){
res.status(500).json(err)
}
});
顺便说一句,您的节点版本必须高于8.0才能运行此代码。
在终端中尝试
node-v
。异步逻辑不能保证顺序。从技术上讲,最后一个查询可以在forEach
中的第一个查询之前执行,您需要使用Promise API而不是回调。例如,使用mysql2/promise
发送mySQLquery@BadDobby感谢您的回答,但老实说,我不知道如何阅读Mario Casciaro和Luciano Mammino编写的node js设计模式。这是一本相当古老的书,但它仍然对你有很大帮助。@ BADOBBY就是这样一种在另一条路线上获取数据的方法,所以我认为我在这里做了一些错误的事情,IDK,无论如何,谢谢,我会考虑阅读这本书。谢谢,我会编辑变量名并尝试它的AWAYOH,我有12版本的节点。JSIT的伟大。如果你不太忙,也要考虑阅读这篇文章: