node.js的api中大量使用了回调函数。当业务较复杂时,代码就可能嵌套多层function回调。这样会照成后续代码难以阅读。
通过第三方co库可以解决此问题。在介绍co库前,先看一下如何查找第三方库及其文档。
node.js提供了第三方库的网站https://www.npmjs.com/
打开https://www.npmjs.com/ 你会发现最上方有一个搜索框。类似百度,你仅需要搜索需要的关键词,就会出现大量的相关库。如搜索mysql,就会出现下图列表。
点击mysql即可查看mysql的文档。
这里我们再来搜索一下co模块,得到如下列表:
点击第一项,进入详情页:
在服务器允许命令npm install 模块名 即可安装该模块
左侧为详细的api文档,阅读文档你就知道该模块如何使用。
api中列出了一个最典型的例子
co(function* () {
return yield Promise.resolve(true);
}).then(function (val) {
console.log(val);
}, function (err) {
console.error(err.stack);
});
其中
function* (val) {
return yield Promise.resolve(val);
}
是一个典型的异步转同步的方法,yield是阻塞关键字,作用是收集其后执行方法的异步返回结果。需要注意的是使用yield的function都要在function后加*。但是带*的function不能像普通的方法一样在任何地方调用。下面举个例子
//正确调用
sum(1,2);
//错误调用,带*方法无法直接调用
getRes(1,2);
}
function sum(a,b){
return a+b;
}
function* getRes(a,b){
yield ....
}
co模块即解决了如上错误调用,修改为co(getRes(1,2))即可。由此可看出co的作用即为将一个包含异步阻塞的方法转换为一个普通的方法。后续章节会讲述更多yield 异步阻塞的例子。关于co的实现原理,可查看其源码。github.com/tj/co