0

次のコードがあるとします。

var co = require('co');

var myObj = {
    getFieldValue: function() {
        var self = this;
        console.log(JSON.stringify(self));
        if (!self.fieldValue) {
            return function(cb) {
                // Emulate an async database load
                setTimeout(function() {
                    self.fieldValue = "the value from the database\n";
                    cb(null, self.fiedValue);
                }, 5000);
            };
        } else {
             return function(cb) {
                cb(null, self.fieldValue);
            };
        }
    },
};

co(function *() {
    var v1 = yield myObj.getFieldValue();
    console.log(v1);
    var v2 = yield myObj.getFieldValue();
    console.log(v2);
});

ご覧のとおり、1 つのメソッドgetFieldValueでmyObjを定義しています。このメソッドが初めて呼び出されると、データベースから値がロードされます。値はキャッシュされ、後続の呼び出しで値を直接返します。このソリューションはうまく機能しますが、オブジェクトのユーザーはジェネレーター コンテキストで実行し、オブジェクト メソッドへの各アクセスの前に yield を書き込む必要があります。

すべての呼び出しはジェネレーター コンテキストで行われると想定できます。 しかし、ユーザーが yield キーワードを含める必要がないようにmyObj実装を書き直す方法はありますか?

ユーザーが次のようなものを(yieldなしで)書くことができるようにしたいと思います:

co(function *() {
    var v1 = myObj.getFieldValue();
    console.log(v1);
    var v2 = myObj.getFieldValue();
    console.log(v2);
});
4

1 に答える 1