简单易扩展的Node.js流程控制引擎:stepify

jopen 10年前

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

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

stepify特点

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

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

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

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

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

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

最简单的用法

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

// Authorizing based on oauth2 workflow  Stepify()      .step('getCode', function(appId, rUri) {          var root = this;          request.get('[authorize_uri]', function(err, res, body) {              root.done(err, JSON.parse(body).code);          });      }, [appId], [redirectUri])      .step('getToken', function(code) {          var root = this;          request.post('[token_uri]', function(err, res, body) {              root.done(err, JSON.parse(body).access_token);          });      })      .step('getInfo', function(token) {          request.get('[info_uri]?token=' + token, function(err, res, body) {              // got user info, pass it to client via http response          });      })      .run();

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

Stepify()      .step('read', __filename)      .step(function(buf) {          // buf is the buffer content of __filename          var root = this;          var writed = 'test.js';            // do more stuff with buf          // this demo just replace all spaces simply          buf = buf.toString().replace(/\s+/g, '');          fs.writeFile(writed, buf, function(err) {              // writed is the name of target file,              // it will be passed into next step as the first argument              root.done(err, writed);          });      })      .step('read')      // `read` here is a common handle stored in workflow      .read(function(p, encoding) {          fs.readFile(p, encoding || null, this.done.bind(this));      })      .run();

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

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

项目主页:http://www.open-open.com/lib/view/home/1407911229926