Node.js Step 的使用

## 解决的问题
在Node.js中,绝大多数实际业务操作都是异步调用,比如文件IO,数据库操作,网络IO等等…… 当这些“耗时”操作完成后,会调用特定的操作,进行后续处理(这个后续的操作被称作callback 函数,作为之前的异步操作调用的最后一个参数)。
如果一个后台调用包含如下步骤:
1. 读取数据库,成功后,
2. 调用ERP接口,下生产订单,成功后,
3. 发送Email通知,成功后,
4. 写入数据库
这样的话,第一个调用的最后一个参数是步骤2对应的callback方法,这个方法再调用步骤3方法、再调用步骤4方法……
整个效果,就是代码缩进后,越来越往右偏。Step就是为了解决这个问题,以一种“非嵌套”的方式,实现之前的这种调用结构。
## 如何使用
step 库对外提供唯一的函数——Step。这个函数接受多个函数作为输入参数,这些参数对应的函数,其callback函数(*最后一个参数*)如果是 _this_,Step就会把下一个参数对应的函数,作为前一个函数调用的callback方法。
Step (
function readSelf() {
fs.readFile(__filename, this);
},
function capitalize(err, text) {
if (err) throw err;
return text.toUpperCase();
},
function showIt(err, newText) {
if (err) throw err;
console.log(newText);
}
);
上例,第一个参数readSelf,包含一个异步调用readFile,我们在该传入callback 函数的位置,传入this。这就保证在异步操作完成后(readFile结束),Step会将读取的文件内容传递到下一个参数对应的函数(这个函数的格式像是普通的callback函数,第一个参数是err,第二个参数表示操作成功后获取的data)。本例中,第二个参数内执行的是“同步”操作,只需要直接return 结果。Step 会将结果,传递到下一个参数对应的函数showIt。
## 对并发动作的支持
一种常见的场景,同时发起两个或者多个异步操作,待这些操作全部正常返回后,需要进行下一步骤处理…… 这些并发的异步操作中,任意一个出现错误,都调用下一步处理的异常处理逻辑。相当于,并发的多个操作对应一个callback,Step 内部记录这些并发异步操作的调用顺序,都成功后,将这些操作的结果按照顺序作为callback调用的参数传递。跟之前的顺序调用不同之处在于:
1. 并发异步调用的callback位置不是_this_,而是使用 _this.parallel()_
2. 后续的callback function(也就是接下来的参数),第一个参数是err,后续每一个参数对应前面并发调用操作返回的结果
Step (
// 同时读取两个文件
function loadStuff() {
fs.readFile(__filename, this.parallel());
fs.readFile(“/etc/passwd”, this.parallel());
},
// 两个文件都读取完成后(可能是任一个出错,或者都正确完成)
function showStuff(err, code, users) {
if (err) throw err;
console.log(code);
console.log(users);
}
)
## Group操作
之前描述的并发动作,在编码时就知道有几个操作,后续的callback函数也就对应的知道有几个参数。但是还有一种场景,有多少并发操作是在运行时才知道的(比如读取某个文件夹下所有文件,具体有多少文件,完全不确定),对于这种动态的、运行时决定任务数量的情况,Step的处理方式:
1. 开始前,调用var group = this.group() 创建新组
2. 每一个动态添加的异步调用,其callback位置,传入group()
3. 后续的参数是函数,待步骤2中的操作出错或者全部完成后调用(callback),第一个参数是err,第二个参数是数组,其中是每一个动态任务的返回结果

Leave Comment