0

我正在使用 mongoose 作为我的数据访问层,我真的很喜欢它提供的用于创建文档模型的不同功能(属性、方法、静态方法..)

我使用 mongoose 的虚拟属性特性来创建不会持久化到 MongoDB 的属性。但是,这些属性的计算成本很高(并且多次使用它们对我没有帮助)。让我们以mongoose virtual
上的相同示例为例, 它持续存在,并且使用 virtual 属性 person.name.firstperson.name.lastperson.name.full

假设我只想在文档的整个生命周期中计算 person.name.full 一次
(如果我允许像示例中那样设置属性或其依赖字段,那么对于脏集之后的每个 get 也是如此)。

我需要在文档范围内有一个额外的变量,所以自然我为此使用了闭包,但计算属性的函数中的“this”范围是全局对象,而不是我正在处理的文档。

代码:

var makeLazyAttribute = function(computeAttribute) {
    var attribute = null;
    return function() {
        if(!attribute) {
            attribute = computeAttribute();     
        }
        return attribute;
    }
};

MySchema.virtual('myAttribute').get(makeLazyAttribute(function () {
    // some code that uses this, this should be the document I'm working on
    // error: first is not defined, inspecting what is this gives me the global object
        return this.first + this.last

}));

请帮忙!

4

1 回答 1

0

好吧,我已经makeLazyAttribute在文档范围内取得了一些进展,所以我只需要更改attribute = computeAttribute();
attribute = computeAttribute.call(this);.

但是,现在我只记得第一次computeAttribute()调用,而不是记住每个文档的第一次函数调用。必须有办法减轻这种情况。

于 2012-05-18T18:27:55.723 回答