What’s wrong with Promise?
Promsie 刚出来的时候欣喜若狂,终于可以摆脱万恶的回调嵌套了。但最近项目中越来越觉得Promise不合场景,当业务逻辑复杂,分支情况变多时代码结构越来越难看。Promise 点then .then的方式注定会依次往下执行, 一同事为了直接返回,不执行下面的逻辑,使用Promise.reject()强行跳转,感觉又看到了goto的影子.(go die …).
然后决定试用一波co模块(tj 的co ,bluebird 的coroutine,还有 when/generator这三个模块有一个共同的特点,yield之后的语句需要返回一个Promise. Promise 是为了解决回调操作带来的麻烦的,相信不需要Promise 也可以把异步代码当成同步代码来写。
zco
灵感来自于tj的co,创新之处在于不需要Promise了,该模块允许你书写同步代码直接调用异步方法。以读文件并打印其内容为例。(假设文件test.txt的内容为hello world)
const co=require("zco");
const fs=require("fs");
co(function*(next){
let [err,data]=yield fs.readFile("./test.txt",next);//有点golang 的感觉 T_T
console.log(err);
console.log(data.toString());//hello world
})()
相同操作 对比 tj 的co
const co=require("co");
const fs=require("fs");
//需要将原本的回调操作包装成promise的版本
let readFile=function(filename){
return new Promise((resolve,reject){
fs.readFile(filename,(err,data)=>{
if(err){
reject(err);
}else{
resolve(data.toString())
}
})
})
}
co(function*(){
let data=yield readFile("./test.txt");
console.log(data);//hello world
}).catch((err)=>{
console.log(err);
})
zco可以无缝对接回调,哈哈。根据性能测试结果, zco是这几个coroutine模块中性能最好的,若追求极限性能的话还是精心设计回调吧,项目地址:https://github.com/yyrdl/zco
目前是稳定版本,亲们都知道的,求star ,客官认为还可以的话就给个呗,当然更欢迎批评意见! ^-^