0

私はデータ アクセス レイヤーに mongoose を使用しています。ドキュメント モデル (属性、メソッド、静的メソッドなど) を作成するために提供されるさまざまな機能が非常に気に入っています。

Mongoose の仮想属性機能を使用して、MongoDB に永続化されない属性を作成します。ただし、これらの属性は計算コストが高くなります(そして、それらを何度も使用しても役に立ちません)。たとえば、マングース仮想
で 同じ例を見てみましょう。 それは持続し、仮想属性を使用します person.name.firstperson.name.lastperson.name.full

ドキュメントの存続期間中に person.name.full を 1 回だけ計算したいとします
(また、例のように属性またはその依存フィールドを設定できる場合は、ダーティ セットの後のすべての 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 に答える