mysql用query再嵌套一个循环query,为什么得到的数据永远不是循环后的query数据,而是循环前的query数据
发布于 6 年前 作者 DavidLuman 2447 次浏览 来自 问答

现在有个需求,查一堆商品,每个商品都至少有一个图片,商品一个表,商品图片一个表 我是先查出所有商品的id和商品信息,然后再把id循环,每次循环再查商品id对应的图片 用的express,查询用连接池,即pool.getConnection里先connection.query,获得result数组[{id:1},{id:2},{id:3}],然后data = result,再 console.log(data) —1 for(var i=0;i<data.length;i++) { connection.query(sql, data[i].id, function(err, resultImage) { data[i][“image”] = resultImage console.log(data) —2 }); }
console.log(data) —3 res.json(data) 每次循环根据商品id再查图片,再对data进行image:resultImage这样的json数据添加。循环后res.json(data)发送回前台 按道理说回去的data数据是[{id:1, image:},{id:2, image:},{id:3, image:}]这样包含 image信息的数据, 但是实际上却只有[{id:1},{id:2},{id:3}]这样的数据,也就是说在for循环之后data数据又变回去了 确实按上面的三个打印结果是console.log(data) --1和–3结果都是[{id:1},{id:2},{id:3}], console.log(data) --2结果才是[{id:1, image:},{id:2, image:},{id:3, image:}]这种形式。 因为是node小白,所以问了别人,别人说这是因为node异步的原因,先跑耗时少的,所以先res.json(data)了 确实打印顺序是console.log(data) —3在console.log(data) —2前打印,然后用了async.whilst将其同步解决了 想问下是不是真的是异步的原因,然后还有没有其它的方法可以解决,或是res.json(data)放在哪个地方来保证所有代码跑完才执行它

3 回复

可以用Promise,也可以用async/await,node解决异步的方式有很多的 学习Promise可以看这个:http://liubin.org/promises-book/ 学习Node.js可以看这个:https://cnodejs.org/topic/5ab3166be7b166bb7b9eccf7

@dingyuanwu 好的我看看

不建议子查询

回到顶部