我一直在使用Node中的ES6生成器进行一段时间的实验,还有一个问题我不明白。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
执行?
它似乎可以通过包装每个yield
ed值和下面的代码依赖它们在它们自己的独立生成器中,然后从一个普通函数中调用这些生成器来解决。然而,如果这是创建非阻塞代码的最有效方式,它将鼓励过多使用可能重复的专用代码的许多小型生成器函数。我正确理解发电机的基本机制吗?如果是这样,这个解决方法是什么?提前致谢。
source one,source two,source three
你可能想看看[了解带有yield/generators的代码流](http:// stackoverflow。com/q/23551418/1048572) – Bergi