[英]How can I emulate a synchronous call with generators in javascript?
假設下一段代碼:
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);
});
如您所見,我使用單個方法getFieldValue定義myObj 。 第一次調用此方法時,它將從數據庫中加載值。 該值將被緩存,並在隨后的調用中直接返回該值。 該解決方案效果很好,但是對象的用戶必須在生成器上下文中運行,並在每次訪問對象方法之前寫一個yield。
我可以假設所有調用都將在生成器上下文中完成。 但是,有沒有一種方法可以重寫myObj實現,以便用戶不需要包含yield關鍵字?
我希望用戶可以這樣寫(沒有收益):
co(function *() {
var v1 = myObj.getFieldValue();
console.log(v1);
var v2 = myObj.getFieldValue();
console.log(v2);
});
如果有幫助,我最近拿出了用C語言為UNIX編寫的流氓程序的第一個版本,並將其重寫了以使javascript在瀏覽器中工作。 我使用一種稱為延續的技術來等待用戶輸入密鑰,因為在javascript中沒有中斷。
所以我會有一段這樣的C代碼:
void function f() {
// ... first part
ch = getchar();
// ... second part
}
那將被轉化為
function f(f_higher_cont) {
// ... first part
var ch = getchar(f_cont1);
return;
// the execution stops here
function f_cont1 () {
// ... second part
f_higher_cont();
}
}
然后繼續存儲以在按鍵事件中重用。 使用閉包,一切將在停止的地方重新開始。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.