Quantcast
Channel: CNode:Node.js专业中文社区
Viewing all articles
Browse latest Browse all 14821

Say Bye Bye to Promise .

$
0
0

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 ,客官认为还可以的话就给个呗,当然更欢迎批评意见! ^-^


Viewing all articles
Browse latest Browse all 14821

Trending Articles