我是node.js的新手,正在开发一个代码库,它通过包含对生成器函数的调用来利用co库。一个简化的例子如下所示:
module.exports.gatherData = function*()
{
// let img = //get the 1 pixel image from somewhere
// this.type = "image/gif";
// this.body = img;
co(saveData(this.query));
return;
};
function *saveData(query)
{
if(query.sid && query.url)
{
// save the data
}
}
所以我去了github上的co主页,描述说:
"基于生成器的nodejs和浏览器的控制流程良好性,使用promises,让你以一种很好的方式编写非阻塞代码。"
在node.js的上下文中,这段代码也不会非阻塞吗?
yield saveData(this.query)
答案 0 :(得分:3)
生成器功能没有任何阻塞/非阻塞。它们只是表达可中断控制流的工具。
流如何被中断仅由生成器的调用者决定,在这种情况下是co
库,它在产生它们时等待异步值。有很多方法可以使用co
:
module.exports.gatherData = co.coroutine(function*() {
…
yield saveData(this.query));
});
var saveData = co.coroutine(function* (query) {
if(query.sid && query.url) {
// save the data
}
});
module.exports.gatherData = co.coroutine(function*() {
…
yield co(saveData(this.query));
});
function *saveData(query) {
if(query.sid && query.url) {
// save the data
}
}
module.exports.gatherData = co.coroutine(function*() {
…
yield* saveData(this.query));
});
function *saveData(query) {
if(query.sid && query.url) {
// save the data
}
}