一个基于Promise+generator(yield)的异步流程控制库
好吧,这是一个轮子,功能上和TJ大神的co一模一样。
本来是我之前MVC框架内部使用的异步控制工具,现在重构一下单独剥离出来。
没有参考过co,思路基本上是一样的,但是我们的Promise风格完全不一样,他是基于es6的promise。
我是基于我的Promise A/+的一个实现(没错又是一个轮子=。=)
非要说有啥特别的地方?我自认为代码结构相对清晰易懂一些(只有70行),好吧,只是自认为而已。
对generator实现流程控制感兴趣的可以看下源代码。
另外自我打脸的是,浏览器运行版本为了不多引用promise库,用的也是es6风格promise(浏览器自带的promise)=。=
npminstallinvok额不要吐槽我的名字,其实是就是invoke这个词的简写。
一来invoke普通单词也没啥意思,二来npm被别人抢注了,囧rz。
varinvok=require('invok');varPromise=require('ipromise');functiondelay(data,delay){//一个异步过程(返回promise)//这也代表了我的promise风格,这里把promise作为一种特殊的异步数据抽象。//所以它像普通数据一样经历创建、填充(异步的)和返回的过程//这样一来,同步函数返回同步数据,异步函数返回异步数据,写法上感觉一致化。而不是每次都把异步函数包装成一个promise(es6的风格)varp=newPromise();setTimeout(function(){p.resolve(data);},delay||500);returnp;}/** * 用法跟co大致一样 * invok接收三个参数 * 第一个参数可以是/函数/generator函数/generator/promise/普通数据 * 当然 主要是用来运行generator函数的。 * 第二个参数是运行第一个参数(如果是函数或者generator函数)时的this * 第三个参数是运行第一个参数(如果是函数或者generator函数)时的参数数组 */invok(function*(){//yield一个promise,返回这个promise的结果 console.log(yielddelay("yield promise",800));//yield 另外一个generator 返回这个generator的结果,(递归嵌套)vardata1=yield(function*(){returnyielddelay("yield a generator",1500);})();console.log(data1);//yield一个promise的数组,首先这个数组里面的所有promise会并行执行,//等所有promise的执行完毕后,这个yield返回他们的结果组成的数组vardata2=yield[delay(1,100),delay(2,300),delay(3,1000),delay(4,500)];console.log(data2);//yield一个promise组成的对象,首先这个对象里面的所有promise会并行执行,//等所有promise的执行完毕后,这个yield返回他们的结果组成的对象,键和值还保持之前的对应关系vardata3=yield{e : delay(1,100),b : delay(2,300),c : delay(3,1000),d : delay(4,500)};console.log(data3);//yield普通对象,跟直接赋值没啥区别console.log(yield123);console.log(yield{text : '普通对象'});return"invok end";}).then(function(data){//一次invok的执行结果console.log(data);},function(e){//一次invok的执行结果console.log(e.stack)});