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);
});

如您所见,我使用单个方法getFieldValue定义myObj。第一次调用此方法时,它会从数据库中加载值。该值被缓存,并在后续调用中直接返回该值。该解决方案效果很好,但是对象的用户必须在生成器上下文中运行,并在每次访问对象方法之前编写一个 yield。

我可以假设所有调用都将在生成器上下文中完成。但是有没有办法重写myObj 实现,以便用户不需要包含 yield 关键字?

我希望用户可以写一些这样的东西(没有产量):

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

1 回答 1

0

如果有帮助,我最近使用 C 语言为 UNIX 编写的流氓的第一个版本,并重写了它以使 javascript 在浏览器中工作。我使用了一种称为 continuation 的技术来等待用户输入密钥,因为在 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();
  }
}

然后存储延续以在按键事件上重用。随着关闭,一切都将在它停止的地方重新启动。

于 2015-03-27T14:17:26.517 回答