Javascript 在来自forEach的另一个回调中引用同一对象

Javascript 在来自forEach的另一个回调中引用同一对象,javascript,Javascript,我正在尝试向对象添加新属性。从这个范围来看,它似乎工作正常: rows.forEach(function (row, i) { row.foo = i; }); 如果我使用console.log(行),我可以看到foo添加了正确的值。如果我在forEach中有另一个回调,我将不再看到更改。为什么? rows.forEach(function (row, i) { getUserById(row.user_id, function(user) { row.f

我正在尝试向对象添加新属性。从这个范围来看,它似乎工作正常:

rows.forEach(function (row, i) {
  row.foo = i;
});
如果我使用console.log(行),我可以看到foo添加了正确的值。如果我在forEach中有另一个回调,我将不再看到更改。为什么?

rows.forEach(function (row, i) {
  getUserById(row.user_id, function(user) {           
    row.foo = i;
  });
});
是的,回调被正确触发。这是getUserById

function getUserById(userId, callback) {
  connection.query('select * from t_user where id = ?', [userId], function(err, results) {

  if (err) {
    console.log("repo error");
  } else {
    if (results.length == 0) {
      callback(null);
  } else {
      callback(results[0]);
    }
  }
});

}

我只能想象,如果
getUserById
延迟调用您传递的回调函数,您将看到这个问题。基于这个假设,你的问题是时间问题

每次调用
getUserById
并向其传递回调时,基本上都是说“当您获得该id的用户时调用此函数”,然后继续执行程序的其余部分。这意味着当调用
console.log
时,您的回调尚未被调用。相反,您必须等待所有回调完成,然后调用依赖于您在回调中设置的值的任何代码

等待所有回调完成的一般方法是创建一个特殊的回调函数,该函数将委托给每个回调,并跟踪它们被调用后的情况

下面是一个使用库的问题和答案,我非常喜欢这个库(尽管有很多库可以解决这个控制流问题)

这里是一个原始JavaScript解决方案,它足够健壮,可以在并非所有回调都相同的一般情况下工作(也就是说,如果您希望每个用户id使用不同的回调)


假设
getUserById
调用回调,那么这应该是可行的。你能发布更多的代码吗?什么是
getUserById
?您正在定义内部函数,但是它没有在这里的任何地方被调用,如果这就是您想要做的,那么在逻辑相同的情况下为什么要使用替代函数定义是值得怀疑的。我猜是你写了回电,但你从来没有回过电话。为什么内部函数有一个未使用的参数呢?可能回调调用的时间比您检查
row.foo
的时间晚(比如,AJAX回调与循环之后的回调)?