簡體   English   中英

如何在javascript中模擬生成器的同步調用?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM