[xchain]是用于简化异步控制流的库,已经在npm上注册了。至于有什么用,用过[Step]的人会明白,但因为我觉得[Step]的异常处理方式是存在一定问题的。这个库的接口设计经过了很久的思考,应该是很简单且实用的。
用代码简要地说明:
var xchain = require('xchain');
var util = require('util');
xchain(
// 在这个圆括号内的作为xchain的参数的两个函数
// 是并行执行的。
function(next) {
setTimeout(function(){
next.foo = 1;
util.log('next.foo completed');
next(); // 表示这个异步操作完成
}, 1000); // 模拟一个用时1秒的异步操作
},
function(next) {
setTimeout(function() {
next.bar = 2;
util.log('next.bar completed');
next();
}, 2000); // 模拟一个用时2秒的异步操作
}
)(
// xchain()返回的也是一个函数,用法和上面相同,
// 用链式的表达式来表示依赖关系
function(next) {
util.log('foo=', next.foo);
util.log('bar=', next.bar);
throw { error : 1 }; // 抛出的异常会被传给run方法的回调捕获
},
function(next) {
next();
}
)(
function(next) {
throw { error : 2 };
}
)(
function(next) {
// 不会执行到此处,自行揣摩传给run方法的回调
}
).run(function(err, next) {
if (err.error == 1)
next(); // 模拟一个可以恢复的错误
// 其他错误不处理
});
###简单的总结
- 通过链式表达式的形式描述异步操作的依赖关系和并行关系,应该是比较简洁而清晰的。
- 异步操作完成时将
next当作函数来调用,以通知xchain当前异步操作完成,当所有并行的操作完成是,xchain会执行下一个(批)异步操作。 - 为了方便数据的通信,也可以将next当作普通的对象使用(如有必要,也可以使用闭包)。
- 在构建好异步控制流之后,调用
run()方法开始从上而下执行。可以给run()方法传递一个异常处理函数,可以在异常处理函数中恢复控制流,或者中断控制流的执行(如不提供异常处理函数,一旦发生异常,默认按照依赖关系停止异步控制流的执行)。
此外,欢迎fork,comment和patch。 [xchain]: http://github.com/thynson/xchain [Step]: http://github.com/creationix/step