1

rows 是数组,row 是对象,我想给 row 添加一个属性;我尝试了以下方法:

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

但是行没有加入 ownername 属性,输出仍然是 [],我错过了什么吗?任何帮助表示赞赏。

不好意思,我说的不清楚,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}]

row 表示行的一个元素,例如

{"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 是异步的。

不能保证 console.dir(rows) 在 User.find(...).success(...) 更新 rows 变量之前或之后执行。

实际上,假设 User.find() 查询数据库或磁盘文件,并且需要 200 毫秒或 1/5 秒才能得到答案。那也可能是永远的。Node 在 for 循环中将所有这些用户信息请求排队。在最初发布的代码中,在发送这些请求后,它立即将行变量的当前值发送到控制台。但这为时过早。它需要等待。

如果 console.dir 在 User.find(...).success(...) 之前执行,则程序将打印未修改的行值。

User.find(...).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 回答