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