我是Node和javascript的新手,并且一直在努力追求以下目标。我创建了一个对象,如下所示:
var Subscriber = { 'userID': String, 'email': String, 'name': String, 'stage': String, 'poster': Boolean, 'canEmail': Boolean, 'stage': String, }
我有一个查询mongodb的函数,并遍历结果,尝试加载一系列用户,我将其声明为:
var s = Subscriber; var subscribers = [];
循环如下所示:
//load array of users that are subscribed to the group async.forEach(g.subscribers, function(item, callback) { //load user document for this user User.findOne({ _id: item}, function(err, u) { if(!err && u) { //var s = new Subscriber(); console.log('Sub load, found user %s, building array item', u.email); console.log('Subs @ loop start'); console.log(util.inspect(subscribers)); console.log('Heres foo: ' + util.inspect(foo)); s.userID = u._id; s.email = u.email; s.name = u.firstName + ' ' + u.lastName; s.stage = u.stage; s.poster = false; //we're just loading subscribers at this point' if(s.stage != 'new') s.canEmail = true; //push new subscriber onto the array console.log('Pushing ' + util.inspect(s)); subscribers.push(s); console.log('At end ' + util.inspect(subscribers)); foo.push(s.email); console.log('Heres foo now: ' + util.inspect(foo)); callback(null, item); }
在每次调用subscriber.push(s)之后,该数组具有正确数量的元素,但是所有元素都与s的最后一个值匹配,如下所示(从数据库中拉出了两个不同的用户):
[ { userID: 4fc53a71163006ed0f000002, email: 'test@test.com', name: 'undefined undefined', stage: 'new', poster: false, canEmail: true }, { userID: 4fc53a71163006ed0f000002, email: 'test@test.com', name: 'undefined undefined', stage: 'new', poster: false, canEmail: true } ]
推送s的单个元素而不是推送整个对象似乎很好。我添加了“ foo”数组作为测试,它可以正常工作:
Heres foo now: [ 'email1@foo.com', 'test@test.com' ]
这里发生了什么?!?!??!
问题不在于的push方法,Array.prototype而是您的绑定。您要s在async.foreach块的每次迭代中修改相同的对象,而该对象实际上与先前定义的对象相同Subscriber。
push
Array.prototype
s
async.foreach
Subscriber
首先,您应该将s变量的声明移至foreach块。
另外,如果您要创建具有默认值的对象,则该对象应为function,它会返回一个新对象:
function
function Subscriber() { return { 'userID': '', 'email': '', 'name': '', 'stage': '', 'poster': false, 'canEmail': false, 'stage': '' }; };
然后可以实例化这样的Subscriber对象:
var s = Subscriber();
有关更多说明,请参见此答案或MDN闭包。