【问题标题】:Variable from for loop always returns 0for 循环中的变量总是返回 0
【发布时间】:2015-06-05 10:40:44
【问题描述】:

我对 node.js /sails.js 相当陌生,遇到了一个问题,我知道答案很简单,但我似乎无法解决。

我的代码如下

SendCompleted : function(req,res)
    {
        var updated = 0;
        var params = req.params.all();
        var dt = JSON.parse(decodeURI(params.id));
        var connection = new sql.Connection(testrmis, function (err)
        {
            if (err) {

            }
            for(var i = 0; i < dt.length; i++) {
                var obj = dt[i];
                var request = new sql.Request(connection);
                request.stream = true;
                request.input('branchid', sql.Int(), obj.branch_id);
                request.input('picklistid', sql.Int(), obj.picklist_id);
                request.input('scanned',sql.Int(),obj.scanned);
                request.input('expected', sql.Int(),obj.expected);
                request.input('poscode', sql.VarChar(),obj.poscode);
                request.input('label', sql.VarChar(), obj.label);
                request.input('dt', sql.VarChar(), obj.dt);
                request.execute('WAREHOUSE_InsertPiPackData');
                request.on('done', function(returnValue) {
                    updated = updated + returnValue;
                    console.log(updated);
                });
            }
            res.send("[{\"ReturnValue\":" + updated + "}]");
        });

    }

我正在发送 4 行结果,并且我的 console.log(updated) 对每一行进行计数,例如 1,2,3,4

但是更新的 res.send 结果始终为 0。

谁能解释一下为什么会这样?我的 var updated 在我的循环之外,并且正在正确更新,但是当循环完成时,它似乎重置为 0?

returnValue == @@rowcount 来自存储过程

【问题讨论】:

    标签: javascript node.js for-loop sails.js


    【解决方案1】:

    requestasync 所以

    res.send("[{\"ReturnValue\":" + updated + "}]");
    

    甚至在您收到请求回调之前执行,因为 JS 不等待回调并执行下一行。你可以做的是使用 counter 并将你的 res.send 放在 for 循环中。

    SendCompleted : function(req,res)
        {
            var updated = 0;
            var params = req.params.all();
            var dt = JSON.parse(decodeURI(params.id));
            var connection = new sql.Connection(testrmis, function (err)
            {
                if (err) {
    
                }
                var count = dt.length;
                for(var i = 0; i < dt.length; i++) {
                    var obj = dt[i];
                    var request = new sql.Request(connection);
                    request.stream = true;
                    request.input('branchid', sql.Int(), obj.branch_id);
                    request.input('picklistid', sql.Int(), obj.picklist_id);
                    request.input('scanned',sql.Int(),obj.scanned);
                    request.input('expected', sql.Int(),obj.expected);
                    request.input('poscode', sql.VarChar(),obj.poscode);
                    request.input('label', sql.VarChar(), obj.label);
                    request.input('dt', sql.VarChar(), obj.dt);
                    request.execute('WAREHOUSE_InsertPiPackData');
                    request.on('done', function(returnValue) {
                        count--;
                        updated = updated + returnValue;
                        console.log(updated);
                        if(count == 0) res.send("[{\"ReturnValue\":" + updated + "}]");
                    });
                }
            });
    
        }
    

    【讨论】:

    • 感谢您的解释和对解决方案的良好建议,正是我所追求的 :-)
    【解决方案2】:

    试试这个:

    可能是异步问题:

    for(var i = 0; i < dt.length; i++) {    
    //Your logic    
      if(i=== dt.length){
         res.send("[{\"ReturnValue\":" + updated + "}]");
      }    
    }
    

    【讨论】:

      【解决方案3】:

      这是因为在您执行 request.send 时,updated 的值不会增加。这是因为 request.execute 是异步的,并且在 res.send 执行后会调用 done 处理程序。

      我会推荐一个 promise 库(例如,q)。你可以合并promise,然后在所有promise都完成后使用Q.all来做req.send。

      查看更多详情here

      【讨论】:

      • 感谢您的建议,我可以看到图书馆的好处,但觉得在我的情况下它会矫枉过正
      猜你喜欢
      • 2015-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多