来自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从存储过程
request
是async
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。
在这里看到更多细节