数组中的NodeJs itemvariables只取得for循环中的第一个值

我正在使用expressJs路由一些POST请求。 从客户端传递对象的对象,然后在服务器中用for循环遍历每个对象。

我的问题是,循环中的variablescantidad只取第一个值,而不是刷新到pool.query ,而是在pool.query之前pool.query正确的值。

所以,下面的行是好的。

 console.log("cantidad before query: " + cantidad); 

但是下面的线是不好的。 它有第一个价值。

 console.log("cantidad in query: " + cantidad); 

这是我的代码的一部分。

 for (var key in objects) { if (objects.hasOwnProperty(key)) { ... console.log("cantidad before query: " + cantidad); pool.query(qProducto,idProducto, function (error, results, fields { if (error) { ... } else { console.log("cantidad in query: " + cantidad); ... 

这是ExpressJ中的完整POST。

 app.post("/commanda", function (req, res) { var idCuenta = req.body.idCuenta; var idEmpleado = req.body.idEmpleado; var fechaRegistro = req.body.fechaRegistro; var cuenta_mesero = "C:" + idCuenta + ":E:" + idEmpleado; var objects = req.body.objects; var element = {}; for (var key in objects) { if (objects.hasOwnProperty(key)) { var qProducto = "SELECT descripcionProducto FROM PRODUCTO WHERE idProducto = ? ;"; var descProducto = ''; console.log("cantidad in commanda2 : " + objects[key].cantidad ); try { pool.query(qProducto, objects[key].idProducto, function (error, results, fields) { if (error) { console.error(error); console.error("Failed with query: " + qProducto); res.status(500).end(); throw error; } else { console.log("cantidad in commanda4 : " + objects[key].cantidad ); descProducto = JSON.stringify(results[0].descripcionProducto); element = { idProducto:objects[key].idProducto, cantidad:objects[key].cantidad, descProducto:descProducto, cuenta_mesero:cuenta_mesero, fechaRegistro:fechaRegistro }; imprimirOrden(element); } }); } catch (error) { callback(error); } } } printer.printVerticalTab(); res.status(200).end(); }); 

这是一个物体的样子。

 { '0': { idProducto: '28', cantidad: '3', descProducto: 'Product1', precioProducto: '3500', precioTotal: 10500, '$$hashKey': 'object:345' }, '1': { idProducto: '29', cantidad: '2', descProducto: 'Product2', precioProducto: '4500', precioTotal: 9000, '$$hashKey': 'object:346' } } 

发生这种情况是因为函数是同步的,但函数poll.query是asynchronous的。 这意味着使用for循环你基本上排队一些查询。 你不是一个接一个地执行它们。 因此,即使查询返回一个结果,for循环也将完成。 如果你想使用查询中的数据进行下一次迭代,你应该开始使用async.js,这是一个npm模块,可以帮助你避免这个问题。 TL; DR您认为在查询中运行的控制台日志实际上是在一个查询完成之前运行的。 更多的信息是需要你声明variablescantidad的地方,当你改变它准确地理解问题。

更新:最初我告诉你是错误的,因为我误解了其他人的拘留。 但是我已经告诉过你的确是这个问题。 这是很好的混淆。for循环即使完成一个查询之前完成。 他们只是排队。 所以第二个console.log将有循环中最后一个键的键。 如果你需要逻辑,需要知道你在哪个迭代中,你应该实现一个asynchronous函数,以便知道你实际在哪个迭代中。 如果你不想使用asynchronous库,你可以使用这样的东西。

首先将这个函数添加到你的js文件https://pastebin.com/4tR0xaTY的底部

你基本上创build了一个asynchronous的循环,你现在可以知道你正在使用loop.iteration()的迭代。 然后用下面的代码replace你的邮政编码(包括asynchronous循环)。 https://pastebin.com/YzZU7bqp