2017-04-16 70 views
1

我正在使用expressJs来路由某些POST请求。 从客户端传递对象的对象,并在服务器中使用for循环遍历每个对象。阵列中的NodeJs项变量只取得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完整的职位。

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' } } 

回答

2

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

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

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

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

+0

好吧,你有一个想法如何实施?使用async.parallel?系列?瀑布? eachSeries?实际上,我的变量'cantidad'不是查询的结果,而是对象的'object'的一部分。查询结果是另一个成功更新的变量。 – negrotico19

+0

您是否根据查询结果更改变量cantidad?如果是,那么我相信系列功能就是你要找的。它将确保在前一个查询完成后调用每个查询。 – itsundefined

+0

阅读你的编辑评论后,我仍然不明白这个问题。代码的哪一部分是你改变变量cantidad?因为您声明只有第一个值是控制台记录的。 – itsundefined

相关问题