Stepify Node.js流程控制引擎

我要开发同款
匿名用户2014年09月01日
125阅读

技术信息

授权协议
未知

作品详情

Stepify(ode-stepify)是一个简单易扩展的Node.js流程控制引擎,采用方法链(methodschai)的方式定制异步任务,使得Node.js工作流易于理解和维护。

目标是将复杂的任务进行拆分成多步完成,使得每一步的执行过程更加透明,化繁为简。

stepify特点

最基本的API的就3个:step(),doe(),ru(),简单容易理解。

精细的粒度划分(同时支持单/多任务),执行顺序可定制化。

每一个异步操作都经过特殊的封装,内部只需要关心这个异步的执行过程。

链式(chai)调用,代码逻辑看起来比较清晰。

灵活的回调函数定制和参数传递。

统一处理单个异步操作的异常,也可根据需要单独处理某个任务的异常。

最简单的用法

简单实现基于oauth2授权获取用户基本资料的例子:

// Authorizig based o oauth2 workflowStepify()    .step('getCode', fuctio(appId, rUri) {        var root = this;        request.get('[authorize_uri]', fuctio(err, res, body) {            root.doe(err, JSON.parse(body).code);        });    }, [appId], [redirectUri])    .step('getToke', fuctio(code) {        var root = this;        request.post('[toke_uri]', fuctio(err, res, body) {            root.doe(err, JSON.parse(body).access_toke);        });    })    .step('getIfo', fuctio(toke) {        request.get('[ifo_uri]?toke=' + toke, fuctio(err, res, body) {            // got user ifo, pass it to cliet via http respose        });    })    .ru();

多个step共用一个hadle、静态参数、动态参数传递的例子:

Stepify()    .step('read', __fileame)    .step(fuctio(buf) {        // buf is the buffer cotet of __fileame        var root = this;        var writed = 'test.js';        // do more stuff with buf        // this demo just replace all spaces simply        buf = buf.toStrig().replace(/\s+/g, '');        fs.writeFile(writed, buf, fuctio(err) {            // writed is the ame of target file,            // it will be passed ito ext step as the first argumet            root.doe(err, writed);        });    })    .step('read')    // `read` here is a commo hadle stored i workflow    .read(fuctio(p, ecodig) {        fs.readFile(p, ecodig || ull, this.doe.bid(this));    })    .ru();

这里多了一个read()方法,但read方法并不是stepify内置的方法。实际上,您可以任意“扩展”stepify链!它的奥妙在于step()方法的参数,详细请看step调用说明。

可以看到,一个复杂的异步操作,通过stepify定制,每一步都是那么清晰可读!

安装$ pm istall stepify运行测试$ pm istall$ mocha灵活使用var Stepify = require('stepify');var workflow1 = Stepify().step(f).step(f)...ru();// orvar workflow2 = ew Stepify().step(f).step(f)...ru();// orvar workflow3 = Stepify().step(f).step(f);// do some stuff ...workflow3.ru();// orvar workflow4 = Stepify().task('foo').step(f).step(f).task('bar').step(f).step(f);// do some stuff ...workflow4.ru(['foo', 'bar']);var workflow5 = Stepify().step(f).step(f);workflow5.debug = true;workflow5.error = fuctio(err) {};workflow5.result = fuctio(result) {};...workflow5.ru();// more ...

注:文档几乎所有的例子都是采用链式调用,但是拆开执行也是没有问题的。

原理

概念:

task:完成一件复杂的事情,可以把它拆分成一系列任务,这些个任务有可能它的执行需要依赖上一个任务的完成结果,它执行的同时也有可能可以和其他一些任务并行,串行并行相结合,这其实跟真实世界是很吻合的。

step:每一个task里边可再细分,可以理解成“一步一步完成一个任务(Fiishataskstepbystep)”,正所谓“一步一个脚印”是也。

stepify内部实际上有两个主要的类,一个是Stepify,一个是Step。

Stepify()的调用会返回一个Stepify实例,在这里称之为workflow,用于调度所有task的执行。

step()的调用会创建一个Step实例,用于完成具体的异步操作(当然也可以是同步操作,不过意义不大),step之间使用简单的api(doe方法和ext方法)传递。

功能介绍

Stepify(node-stepify) 是一个简单易扩展的Node.js流程控制引擎,采用方法链(methods chain)的方式定制异步任务,使得Node.js工作流易于理解和维护。 目...

声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态

评论