-1

私はこのコンストラクタを持っています:

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 は元のオブジェクトへの参照を保持しています (推測します)。

4

1 に答える 1