1

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

rows.forEach(function (row, i) {
  row.foo = i;
});

如果我执行 console.log(rows) 我可以看到 foo 添加了正确的值。如果我在 forEach 中有另一个回调,我不会再看到更改。为什么?

rows.forEach(function (row, i) {
  getUserById(row.user_id, function(user) {           
    row.foo = i;
  });
});

是的,回调 get 正确触发。这是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]);
    }
  }
});

}

4

1 回答 1

0

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

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

等待所有回调完成的一般方法是制作一个特殊的回调函数,该函数将委托给每个回调,并在它们全部被调用后进行跟踪。

这是一个使用异步库回答的问题,我很喜欢这个库(尽管有许多库可以解决这个控制流问题)。

在 Node.js 中等待多个回调的惯用方式

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

多个异步回调 - 完成时使用数组触发函数

于 2013-02-08T22:00:31.623 回答