-
Notifications
You must be signed in to change notification settings - Fork 2
使用step flow简化按顺序执行的业务流程
张代应 edited this page Jun 8, 2017
·
6 revisions
在写项目的过程中,经常会遇到一些业务流程是按步骤的,比如要实现一个简单的hosts代理,当代理服务器接收到一个请求之后,需要经过以下步骤:
- 获取请求的hostname
- 读取hosts文件配置信息
- 解析最终的IP构造新的请求信息
- 发送请求
- 处理响应数据
- 发送到客户端
上面的流程中,上一步的处理结果,在下一步中需要用到,而且每一步都需要用到一些公共的数据,也就是需要一个上下文。
当然,这只是一个简单的例子,类似这样的流程还有很多。
当前比较流行的、能够方便管理这些流程的库有:step,async。这些库,各种自己的优缺点,这里不去一一点评。
如果我们对express的中间件比较熟悉,不难发现,其实中间件就是一个比较好的流程控制模式。每个流程的处理函数,都会接收到三个参数(req, res, next)
。req
和res
贯穿与整个应用的请求-响应周期,而next()
则控制了中间件的执行。而这正式一个比较理想的流程控制模式,所以参考这种模式,step-flow
诞生了。
step-flow的使用方法跟上面提到的express中间件非常类似:
- 使用
use([step,]fn1[, fn2, ..., fnN])
添加流程处理函数 - 在流程处理函数中,调用
next([error, data])
执行下一个流程处理函数。如果传递error,则不再执行后续的函数,转而执行错误处理函数。 - 流程处理函数会接收到一个贯穿于整个流程的上下文对象
流程处理函数可以做的事情:
- 执行任何逻辑代码
- 操作上下文对象
- 调用下一个流程处理函数
这些基本上与express中间件一致,除此之外,step-flow还添加了一些新的特性:
- 在流程处理函数中,使用
nextTo(step[, data])
跳转到任意一个存在的步骤 - 调用
catch(fn[, fn1, ..., fnN])
添加错误处理函数 - 调用
run([context, step])
来执行流程处理函数 ...