数组中的NodeJs项变量仅获取for循环中的第一个值

时间:2017-04-16 19:08:22

标签: node.js express asynchronous

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

我的问题是,循环中的变量cantidad只取第一个值而不是刷新到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);
    ...

这是ExpressJs中的完整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' } }

1 个答案:

答案 0 :(得分:3)

这是因为函数for是同步的,但函数poll.query是异步的。这意味着使用for循环实际上是排队一些查询。你没有逐个执行它们。因此,即使从查询返回一个结果,for循环也会完成。如果要使用查询中的数据进行下一次迭代,您应该开始使用async.js,这是一个帮助您避免此问题的npm模块。 TL; DR您认为在查询中运行的控制台日志实际上是在一个查询完成之前运行的。您需要更多信息来声明变量cantidad以及何时更改变量以准确理解问题。

更新: 起初我告诉你的是非常错误的,因为我误解了其他人的被拘留{}。但我告诉你的实际上是问题所在。它被很好地混淆了。在一个查询完成之前,for循环完成。他们刚排队等候。所以第二个console.log将拥有循环中最后一个键的键。如果您需要逻辑,需要知道您在哪个迭代中应该实现异步函数,以便知道您实际在哪个迭代中。如果您不想使用异步库,可以使用类似的东西。

首先在js文件的底部添加此功能 https://pastebin.com/4tR0xaTY

你基本上创建了一个异步for循环,你现在可以知道在哪个迭代中使用loop.iteration()。然后用下面写的代码替换你的邮政编码(包括异步循环)。 https://pastebin.com/YzZU7bqp