for循环的变量总是返回0

时间:2015-06-05 10:40:45

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

我对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(已更新)计入每行的数量,例如1,2,3,4

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

有人可以解释为什么会这样吗?我的var更新是在我的循环之外,这是正确更新,但是当循环结束时它似乎重置为0?

来自存储过程的

returnValue == @@ rowcount

3 个答案:

答案 0 :(得分:2)

requestasync所以

res.send("[{\"ReturnValue\":" + updated + "}]");
即使在请求回调之前,

也会执行,因为JS不会等待回调并执行下一行。你可以做的是使用counter并将res.send放在里面进行循环。

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 count = dt.length; //COUNTER
                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) {
                    counter--;
                    updated = updated + returnValue;
                    console.log(updated);
                    if(counter == 0) res.send("[{\"ReturnValue\":" + updated + "}]");
                });
            }
        });

    }

答案 1 :(得分:1)

尝试这个:

可能是异步问题:

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

答案 2 :(得分:1)

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

我会推荐一个promise库(例如,q)。您可以组合承诺,然后在完成所有承诺后使用Q.all执行req.send。

查看更多详情here