假设你已经阅读并基本理解了EventProxy的官方说明https://www.npmjs.com/package/eventproxy,否则你有两个选择:
1、先阅读官方说明,再浏览本文
2、如果不愿意做第1条,关闭本页面去别处逛逛。
言归正传。
fail除了用于协助all方法完成外,也能协助after中的异常处理。另外,在after的回调函数中,结果顺序是与用户emit的顺序有关。为了满足返回数据按发起异步调用的顺序排列,EventProxy提供了group方法。
var ep = new EventProxy();
ep.after('got_file', files.length, function(list) {
// 在所有文件的异步执行结束后将被执行
// 所有文件的内容都存在list数组中,按顺序排列
});
for (var i = 0; i < files.length; i++) {
fs.readFile(files[i], 'utf-8', ep.group('got_file'));
}
group秉承done函数的设计,它包含异常的传递。同时它还隐含了对返回数据进行编号,在结束时,按顺序返回。
ep.group('got_file');
// 约等价于
function (err, data) {
if(err) {
return ep.emit('error', err);
}
ep.emit('got_file', data);
};
例如,假设存在文件D:\1.txt和D:\2.txt。其中1.txt是大小超过3M的长文本文件。对于以下代码,group将能按照文件读取顺序返回结果(Node已测)。
var fs=require("fs");
varEventProxy=require("eventproxy");
var ep = new EventProxy();
varfiles=["D:\\1.txt","D:\\2.txt"];
ep.after('file',files.length,function(list) {
//'file'事件触发files.length次之后进入这里。
for(var i=0;i<files.length;i++)
console.log(list[i].toString());
});
for (var i = 0; i < files.length; i++) {
//console.log("read");输出两次,尽管1.txt是大文件。
fs.readFile(files[i],'utf-8', ep.group('file'));
//fs.readFile(files[i], 'utf-8',function(err,data){
// console.log(data.toString());
//});
//fs.readFile是异步的,因为我们故意使1.txt比2.txt大很多,因此读取1.txt要比2.txt耗时。由于这个原因,2.txt的回调函数将先于1.txt被调用(已测),但输出的结果显示1.txt的内容排在最前面,说明group内部的确自动为我们完成了这种排序工作。
}
当回调函数的数据还需要进行加工时,可以给group带上回调函数,只要在操作后将数据返回即可:
ep.group('got_file', function (data) {
//some code
return data;
});