【发布时间】:2014-08-21 14:44:03
【问题描述】:
我已经在 Node 中试验 ES6 生成器有一段时间了,但仍有一个问题我不明白。
在常规回调节点中,从数据库中获取值并并行执行其他操作看起来像这样:
function executeBoth(){
db.find("value", function(results){
console.log(results);
});
doSomethingElse("else", function(data){
console.log(data);
});
}
这个例子完全是人为的,但是请注意,通过调用executeBoth()、db.find 和doSomethingElse,不要等待对方完成,Node 可以同时执行这两个操作,并且代码是非阻塞的.
这是一个尝试做同样事情的生成器示例:
function* executeBoth(){
var results = yield db.find("value");
console.log(results);
var data = yield doSomethingElse("else");
console.log(data);
}
我不明白上面的代码如何避免第一个函数阻塞第二个函数。从我读到的内容(以下来源),似乎整个生成器在到达 yield 关键字时暂停。这对于依赖于从特定 yield 返回的值的代码行来说是有意义的,但这是否也意味着 db.find 会阻止 doSomethingElse 执行?
似乎可以通过将每个 yielded 值和依赖于它们的以下代码包装在它们自己的单独生成器中来解决,然后从普通函数中调用这些生成器。然而,如果这是创建非阻塞代码的最有效方式,它将鼓励过度使用许多具有可能重复的专用代码的小型生成器函数。我是否正确理解了生成器的基本机制?如果是这样,解决方法是什么?提前致谢。
【问题讨论】:
标签: javascript node.js generator coroutine ecmascript-harmony