1

行は配列、行はオブジェクト、行にプロパティを追加したい。私は次のことを試しました:

rows.forEach(function(row) {
    User.find(row.owner).success(function(user) {
        row.ownername = user.username;
    });
});
console.dir(rows);

行は所有者名プロパティに結合されていませんが、出力はまだ[]です。何か不足していますか? どんな助けでも大歓迎です。

申し訳ありませんが、明確ではないと言いました。行は次のような配列です。

[{"id":19427,"name":"data1","owner":123},
{"id":19427,"name":"data2","owner":123},
{"id":19427,"name":"data3","owner":123},
{"id":19427,"name":"data4","owner":123}]

行は、次のような行の要素を表します

{"id":19427,"name":"data2","owner":123}

行にプロパティを追加したいだけで、最終的に次のような行

[{"id":19427,"name":"data1","owner":123,"ownername":"a"},
{"id":19427,"name":"data2","owner":123,"ownername":"ab"},
{"id":19427,"name":"data3","owner":123,"ownername":"abc"},
{"id":19427,"name":"data4","owner":123,"ownername":"abcd"}]
4

1 に答える 1

1

Node.js は非同期です。

User.find(...).success(...) が rows 変数を更新する前後に console.dir(rows) が実行されるという保証はありません。

実際問題として、User.find() がデータベースまたはディスク ファイルを参照し、回答を得るのにたとえば 200 ミリ秒または 1/5 秒かかるとします。それは永遠かもしれません。ノードは、for ループでユーザー情報のこれらすべての要求をキューに入れています。最初に投稿されたコードでは、これらのリクエストを送信した直後に、行変数の現在の値をコンソールに送信します。しかし、それは早すぎます。待つ必要があります。

console.dir が User.find(...).success(...) の前に実行された場合、プログラムは変更されていない行の値を出力します。

User.find(...).success(...) は、将来の未知の時点で行が更新される可能性を設定するだけです。このコードは通常、「ユーザーを見つけ、ユーザーが見つかったら、success 関数を実行する 」と解釈する必要があります。

さらに、User... への呼び出しが正しいかどうか、この User API またはバックエンドでクエリを実行するのに十分かどうか、またはそのコードにバグがある可能性があるかどうかはわかりません。

これを試して、より賢明なものが得られるかどうかを確認してください。

rows.forEach(function(row) {
    User.find(row.owner).success(function(user) {
       console.log("changing row.ownername from "+row.ownername); 
       row.ownername = user.username;
       console.log("to "+user.username+" -- result "+row.ownername);

    });
});
console.dir(rows);
setTimeout(function(){ console.dir(rows); }, 10000); // 10 sec delay
于 2013-06-29T07:55:50.903 に答える