Javascript 在for循环中链接承诺的最佳方式是什么?
我知道这对我来说似乎很愚蠢,但我不确定最好的方法是什么 我现在有一个for循环,它循环遍历库存项,然后触发一个套接字,从MySql获取特定项的外键。这完全可以,但在检索到该键之后,我需要减去该项的数量。我想我可以在那一个套接字之后链接另一个套接字,但看起来在第一个套接字被触发后,第二个套接字触发时,循环已经完成,这给了我这些项目的错误数量 以下是我试图在客户端实现的目标Javascript 在for循环中链接承诺的最佳方式是什么?,javascript,node.js,socket.io,Javascript,Node.js,Socket.io,我知道这对我来说似乎很愚蠢,但我不确定最好的方法是什么 我现在有一个for循环,它循环遍历库存项,然后触发一个套接字,从MySql获取特定项的外键。这完全可以,但在检索到该键之后,我需要减去该项的数量。我想我可以在那一个套接字之后链接另一个套接字,但看起来在第一个套接字被触发后,第二个套接字触发时,循环已经完成,这给了我这些项目的错误数量 以下是我试图在客户端实现的目标 BinTestMethod(){ var ItemObject=[ {序列号:“AMSD0027LF”,数量:2}, {序列号
BinTestMethod(){
var ItemObject=[
{序列号:“AMSD0027LF”,数量:2},
{序列号:“AMSD0003LF”,数量:1},
]
//console.log(ItemObject[0]);
//log(ItemObject.length);
对于(var i=0;i{})
}
这是承诺
导出常量selectParentFromInventory=async(ItemObject)=>{
返回新承诺(异步(解析、拒绝)=>{
试一试{
const getParentID=`从console.inventory中选择ParentID,其中Serial='${ItemObject.Serial}'`;
const response=await db(getParentID,“ParentID”);
//控制台日志(响应);
决心(回应);
}捕获(e){
console.log(“ERROR inventory.selectparentfrom inventory:+e”);
拒绝(e);
}
});
};
导出常量updateParentQuantity=(数量,ID)=>{
返回新承诺(异步(解析、拒绝)=>{
让我们平等;
console.log(ID);
试一试{
updateQuantity=`UPDATE console.inventory\u items SET QuantityOnHand=QuantityOnHand-${Quantity}其中ID=“${ID}”`
//控制台日志(响应);
const response=await db(updatequality,`updateQuantity`);
决心(回应);
}捕获(e){
console.log(“ERROR inventory.updateQuantity:+e”);
拒绝(e);
}
});
};
这是插座
socket.on('selectParentFromInventory',(数据,回调)=>{
const results=选择ParentfromInventory(数据)。然后((结果)=>{
回调(结果);
})
});
socket.on('updateParentQuantity',异步(ItemObject,ID,回调)=>{
试一试{
const results=await updateParentQuantity(ItemObject,ID);
如果(results.affectedRows==1){
回调(true);
//emit(“refreshJobPage”,false,”;
}
回调(假);
}
捕获(错误){}
});
当我运行此命令时,我从呼叫中收到的ID是正确的,但当我记录数量时,它每次都给我数字1。相反,我应该得到数量1和2
我想尝试的一个建议是将整个ItemObject传递给套接字,然后在套接字本身中循环,但不确定这是否是一个好主意
我知道我的代码在逻辑上可能不正确,但如果有人对我如何使这项工作有一些好的建议,我将不胜感激!
谢谢。我不确定我是否理解您的所有要求,但我可以在
for
循环的一个方面帮助您
简而言之,将quantity
变量的定义更改为const
。这将为通过for
循环的每个迭代赋予它一个唯一且独立的值,并且由于您在声明后没有修改它,因此它是const
的自然值,尽管let
也可以正常工作
然后,将id
变量的声明移动到回调中,因为它只在那里需要,并使用const
。这实际上可能不是必需的,但这是一种很好的编码实践,因此您不会有多个回调共享同一个变量
这是因为const
和let
是块作用域。每次进入块时,它们都会创建变量的新实例<代码>变量是函数作用域。for循环的每次迭代都被视为一个新块,因此它使用const
或let
创建循环中定义的任何变量的新副本。因此,即使承诺需要一段时间才能完成,而且for
循环仍在继续,循环的每个迭代都有自己的const
和let
变量,以便在承诺最终完成时使用正确的变量。99.999%的情况下,您现在应该使用let
或const
,而不是var
因此,改变这一点:
BinTestMethod(){
var ItemObject = [
{Serial: "AMSD0027LF", Quantity: 2},
{Serial: "AMSD0003LF", Quantity: 1},
]
// console.log(ItemObject[0]);
//console.log(ItemObject.length);
for(var i = 0; i < ItemObject.length; i++){
//console.log(ItemObject.length);
console.log(ItemObject[i].Serial);
var id;
var quantity = ItemObject[i].Quantity;
socket.emit('selectParentFromInventory', ItemObject[i], function (result){
id = result[0].ParentID;
//console.log(id);
//console.log(quantity);
this.UpdateQuantity(quantity, id);
}.bind(this));
}
}
UpdateQuantity(Quantity, ID){
console.log(Quantity);
socket.emit('updateParentQuantity', Quantity, ID, (boolean) => {})
}
BinTestMethod(){
var ItemObject=[
{序列号:“AMSD0027LF”,数量:2},
{序列号:“AMSD0003LF”,数量:1},
]
//console.log(ItemObject[0]);
//log(ItemObject.length);
对于(var i=0;i BinTestMethod(){
var ItemObject = [
{Serial: "AMSD0027LF", Quantity: 2},
{Serial: "AMSD0003LF", Quantity: 1},
]
// console.log(ItemObject[0]);
//console.log(ItemObject.length);
for (let i = 0; i < ItemObject.length; i++){
const quantity = ItemObject[i].Quantity;
socket.emit('selectParentFromInventory', ItemObject[i], function (result){
const id = result[0].ParentID;
//console.log(id);
//console.log(quantity);
this.UpdateQuantity(quantity, id);
}.bind(this));
}
}
UpdateQuantity(Quantity, ID){
console.log(Quantity);
socket.emit('updateParentQuantity', Quantity, ID, (boolean) => {})
}