【问题标题】:Increment var in callback node js回调节点js中的增量var
【发布时间】:2016-05-02 10:06:19
【问题描述】:

是否有可能在这段代码中增加 var licznik? 我尝试这样,但总是收到 0。有人可以解释一下我做错了什么吗?

rows.forEach(function(record) {
  var licznik = 0;
  var offer = manager.createOffer('76561198252553560');                       
  inventory.forEach(function(item) {
    if(licznik <= record.amount) {
      if(item.market_hash_name == record.real_name) {
        var asid = item.assetid;
        (function(licznik){
          connection.query('SELECT count(id) as wynik FROM used where asset_id = \'' + asid + '\'', function(err, wiersze) {
            if (wiersze[0].wynik == 0) {
              var employee = {
                asset_id: asid,
                trans_id: record.tid
              };
              connection.query('INSERT INTO used SET ?', employee, function(err, res) {
                if (err) throw err;
                offer.addMyItem(item);

                console.log(licznik);
                &licznik++;
              });
            }   
          }); 
        })(licznik);
      }
    }

  });
});

【问题讨论】:

标签: javascript node.js


【解决方案1】:

正如您对原始问题的评论所指出的,我没有关于这段代码实际试图完成的内容的上下文。我可以告诉您的是,您提供给connection.query 的回调不会forEach 的每次迭代中触发。 connection.query 需要回调的全部原因是因为您不知道操作何时完成。 Node 被设计为异步的,所以它在forEach 循环的每次迭代中所做的只是开始查询。可以随时调用提供给查询的回调,这也意味着在另一个查询之后触发的查询可能会在第一个查询的回调之前触发其回调。这仅取决于每个查询需要多长时间。

如果您需要在 forEach 的每次迭代中递增 licznik,那么您需要在 if 语句之后递增它。

rows.forEach(function(record) {
  var licznik = 0;
  var offer = manager.createOffer('76561198252553560');                       
  inventory.forEach(function(item) {
    if(licznik <= record.amount) {
      // .... omitted for brevity
    }
    licznik++; // <-- increment here, outside of the closure.
  });
});

再一次,我对你实际上试图用那个变量做什么的线索为零,所以这可能无法解决你真正的问题,但这是让它在那个循环中递增的方法。

PS - 您可能不理解这里实际上有 两个 licznik 变量。当你像你一样将所有逻辑包装在一个闭包函数中时,你会创建一个新的。如果您更改在闭包函数顶部声明的变量,您会发现它与闭包函数外部的变量不同。

rows.forEach(function(record) {
  var licznik = 0;
  var offer = manager.createOffer('76561198252553560');                       
  inventory.forEach(function(item) {
    if(licznik <= record.amount) {
      if(item.market_hash_name == record.real_name) {
        var asid = item.assetid;
        (function(licznik2) { // <-- notice this is a new variable
          connection.query('SELECT count(id) as wynik FROM used where asset_id = \'' + asid + '\'', function(err, wiersze) {
            if (wiersze[0].wynik == 0) {
              var employee = {
                asset_id: asid,
                trans_id: record.tid
              };
              connection.query('INSERT INTO used SET ?', employee, function(err, res) {
                if (err) throw err;
                offer.addMyItem(item);

                console.log(licznik2);
                licznik2++;
              });
            }   
          }); 
        })(licznik);
      }
    }
  });
});

【讨论】:

    猜你喜欢
    • 2016-11-25
    • 2021-07-30
    • 2018-07-15
    • 1970-01-01
    • 2018-06-10
    • 1970-01-01
    • 2018-10-10
    • 2014-09-25
    • 1970-01-01
    相关资源
    最近更新 更多