来自for循环的variables总是返回0

我对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从存储过程

requestasync

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

甚至在请求callback之前得到执行,因为JS不会等待callback并执行下一行。 你可以做的是使用一个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 + "}]"); }); } }); } 

试试这个:

可能是asynchronous问题:

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

这是因为在执行request.send时,更新的值不会递增。 这是因为request.execute是asynchronous的,执行完res.send之后,会调用done处理函数。

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

在这里看到更多细节