来自 for 循环的变量总是 returns 0
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(更新)对每一行进行了计数,例如 1,2,3,4
然而 res.send 更新结果始终为 0。
谁能解释一下为什么会这样?我的 var updated 在我的循环之外并且正在正确更新,但是当循环完成时它似乎重置为 0?
returnValue == 来自存储过程的@@rowcount
试试这个:
可能是异步问题:
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 执行后调用。
我会推荐一个 promise 库(例如,q)。您可以组合承诺,然后在完成所有承诺后使用 Q.all 执行 req.send。
查看更多详情here
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) {
}
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 + "}]");
});
}
});
}
我是 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 updated 在我的循环之外并且正在正确更新,但是当循环完成时它似乎重置为 0?
returnValue == 来自存储过程的@@rowcount
试试这个:
可能是异步问题:
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 执行后调用。
我会推荐一个 promise 库(例如,q)。您可以组合承诺,然后在完成所有承诺后使用 Q.all 执行 req.send。
查看更多详情here
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) {
}
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 + "}]");
});
}
});
}