假设你已经阅读并基本理解了EventProxy的官方说明https://www.npmjs.com/package/eventproxy,否则你有两个选择:
1、先阅读官方说明,再浏览本文
2、如果不愿意做第1条,关闭本页面去别处逛逛。
言归正传。
EventProxy提供了统一的异常处理机制,一旦有异常发生,则移除所有事件的监听器:
ep.bind('error',function (err) {
// 卸载掉所有handler
ep.unbind();
});
但我们不需要手工添加监听'error'事件的代码,因为done隐含了错误处理。ep.done('tpl')等价于
function (err, content) {
if(err) {
// 一旦发生异常,done内部将发射'error'事件
returnep.emit('error', err);
}
ep.emit('tpl', content);
}
但由谁来统一响应这个'error'事件呢?答案是使用fail。
ep.fail(callback);
// 由于参数位相同,它实际是
ep.fail(function (err) {
callback(err);
});
// 等价于
ep.bind('error', function (err) {
// 卸载掉所有handler
ep.unbind();
// 异常回调
callback(err);
});
示例代码:
//fail and done
varfiles=["D:\\1.txt","D:\\2.txt","D:\\3.txt"];
ep.after('file',files.length,function(list) {
console.log("after");
for(var i=0;i<files.length;i++)
console.log(list[i].toString());
});
ep.fail(function(err){
console.log(err);
})
for (var i = 0; i < files.length; i++) {
console.log("read");
fs.readFile(files[i], 'utf-8', ep.done('file'));
}
因为故意使D:\\3.txt不存在于物理磁盘上,所以readFile时抛出了异常。
运行结果为:
read
read
read
{ [Error: ENOENT, open 'D:\3.txt'] errno:34, code: 'ENOENT', path: 'D:\\3.txt' }
但需要注意的是,done并不具有group的自动排序功能(已测)。然而,仅仅是done隐含了异常处理机制吗?答案是否定的。将上述代码中的ep.done('file')替换成ep.group('file'),发现运行结果是一样的(已测),前提是我们均调用了ep.fail(),以响应所有可能抛出的异常。