Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在for循环中链接承诺的最佳方式是什么?_Javascript_Node.js_Socket.io - Fatal编程技术网

Javascript 在for循环中链接承诺的最佳方式是什么?

Javascript 在for循环中链接承诺的最佳方式是什么?,javascript,node.js,socket.io,Javascript,Node.js,Socket.io,我知道这对我来说似乎很愚蠢,但我不确定最好的方法是什么 我现在有一个for循环,它循环遍历库存项,然后触发一个套接字,从MySql获取特定项的外键。这完全可以,但在检索到该键之后,我需要减去该项的数量。我想我可以在那一个套接字之后链接另一个套接字,但看起来在第一个套接字被触发后,第二个套接字触发时,循环已经完成,这给了我这些项目的错误数量 以下是我试图在客户端实现的目标 BinTestMethod(){ var ItemObject=[ {序列号:“AMSD0027LF”,数量:2}, {序列号

我知道这对我来说似乎很愚蠢,但我不确定最好的方法是什么

我现在有一个for循环,它循环遍历库存项,然后触发一个套接字,从MySql获取特定项的外键。这完全可以,但在检索到该键之后,我需要减去该项的数量。我想我可以在那一个套接字之后链接另一个套接字,但看起来在第一个套接字被触发后,第二个套接字触发时,循环已经完成,这给了我这些项目的错误数量

以下是我试图在客户端实现的目标

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) => {})
    }