增量回调节点js中的var

时间:2016-01-25 22:35:43

标签: javascript node.js

是否可以在此代码块中增加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);
      }
    }

  });
});

1 个答案:

答案 0 :(得分:0)

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

如果您需要在licznik的每次迭代时递增forEach,那么您需要在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);
      }
    }
  });
});