簡體   English   中英

來自for循環的變量始終返回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(updated)會按行計數,例如1,2,3,4

但是,更新的重新發送結果始終為0。

誰能解釋為什么會這樣嗎? 我的var更新在我的循環之外,並且正在正確更新,但是當循環結束時,它似乎重置為0?

returnValue == @@ rowcount來自存儲過程

requestasync

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM