我有這樣的構造:我需要在這個地方關閉嗎?
var EditableItem = (function() {
function EditableItem(schema, item) {
this.schema = _.clone(schema);
this.item = _.clone(item);
this.propertyTypes = [
'stringProperties',
'booleanProperties'];
}
EditableItem.prototype = {
createItem: function() {
var self = this;
self.propertyTypes.forEach(function(type) {
var properties = self.schema[type];
properties.forEach(function(property, i) {
var itemProperty = self.item[type][property.id];
if (itemProperty) {
properties[i].value = itemProperty;
}
});
});
self.schema.itemId = self.item._id;
return self.schema;
}
};
return EditableItem;
})();
,每次我用它,這樣的時刻......
async.parallel({
schema: function(callback) {
schemas().findOne({
_id: 'default'
}, callback);
},
items: function(callback) {
items().find().toArray(callback);
}
},
function(err, result) {
if (err) return callback(err);
var all = result.items.map(function(item) {
return new EditableItem(result.schema, item).createItem();
});
callback(null, all);
});
...我結束了一個數組result
其中最後一個項目反覆而其他的被省略。
我的猜測是我需要在某處添加一個閉包,正如你所看到的我已經嘗試過,但它仍然會產生相同的結果。有任何想法嗎?
編輯:我找到了解決方案。這不是很好,但也許這裏有人可以解釋它爲什麼可以工作並提供更好的解決方案...
在構造函數中,我有: this.schema = _.clone(schema);
我改爲: this.schema = JSON.parse(JSON.stringify(schema));
這似乎爲對象分配新的內存,而_.clone仍然保留對原始對象的一些引用(我猜)。
普通對象沒有'.map()'方法。即便如此,你沒有理由在你的'.map()'回調函數裏有另一個函數。你已經有了一個唯一的變量作用域。 – 2013-05-09 18:23:53
也許是因爲你在內部結束時有一個額外的')'? - '})(schema,item));' – Ian 2013-05-09 18:24:30
'var EditableItem =(...)();' ... – Nenad 2013-05-09 18:27:10