私はこのコンストラクタを持っています:
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 は元のオブジェクトへの参照を保持しています (推測します)。