当前位置: 首页 > 工具软件 > EventProxy > 使用案例 >

[EventProxy(四)]EventProxy之异常处理

夏侯星洲
2023-12-01

假设你已经阅读并基本理解了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(),以响应所有可能抛出的异常。

 类似资料: