次のコードがあるとします。
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);
});