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が呼び出されたとき、コールバックはまだ呼び出されていません。代わりに、すべてのコールバックが終了するのを待ってから、コールバックで設定している値に依存するコードを呼び出す必要があります。

すべてのコールバックが終了するのを待つ一般的な方法は、各コールバックに委任し、すべてのコールバックを追跡する特別なコールバック関数を作成することです。

これは、私がファンであるasyncライブラリを使用した回答付きの質問です (ただし、この制御フローの問題に取り組むライブラリは多数あります)。

Node.js で複数のコールバックを待機する慣用的な方法

すべてのコールバックが同じではない一般的なケース (つまり、ユーザー ID ごとに異なるコールバックが必要な場合) で機能するのに十分な堅牢な生の JavaScript ソリューションを次に示します。

複数の非同期コールバック - 完了時に配列を使用して関数を起動する

于 2013-02-08T22:00:31.623 に答える