![](/img/trans.png)
[英]jstl : foreach loop setting values to a hidden variable returns zero always
[英]Variable from for loop always returns 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(updated)会按行计数,例如1,2,3,4
但是,更新的重新发送结果始终为0。
谁能解释为什么会这样吗? 我的var更新在我的循环之外,并且正在正确更新,但是当循环结束时,它似乎重置为0?
returnValue == @@ rowcount来自存储过程
request
是async
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) {
}
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 + "}]");
});
}
});
}
为此尝试:
可能是异步问题:
for(var i = 0; i < dt.length; i++) {
//Your logic
if(i=== dt.length){
res.send("[{\"ReturnValue\":" + updated + "}]");
}
}
这是因为在您执行request.send时,updated的值不会增加。 这是因为request.execute是异步的,res.send执行后将调用done处理程序。
我会推荐一个Promise库(例如q)。 您可以合并承诺,然后在完成所有承诺后使用Q.all进行req.send。
在这里查看更多详细信息
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.