一、简介

主要是为了熟悉一下 eventproxy 的主要 API 的使用。

eventproxy 是 @朴灵 的作品,主要是解决异步嵌套以及并发问题。

安装方式:

yarn add eventproxy

可以在浏览器端使用:

<script src="https://raw.github.com/JacksonTian/eventproxy/master/lib/eventproxy.js"></script>

二、基本使用

1、ep.all(['tpl'],(tpl)=>{})

下面的方式可以通过 EventProxy.create(['tpl',(tpl)=>{}]) 代替

const ep = new EventProxy();
ep.all(['tpl', 'data'], (tpl, data) => { 
  // 在所有指定的事件触发后,将会被调用执行 参数对应各自的事件名 
  // 后面的 tpl 和 data 的顺序和前面监听的时间顺序是一样的
});
fs.readFile('template.tpl', 'utf-8', function (err, content) {
  ep.emit('tpl', content);
});
db.get('some sql', function (err, result) {
  ep.emit('data', result);
});

2、ep.after('tpl',length,(list)=>{}) 重复异步协作

其中 length 参数是并发的次数,也就是说到了多少次之后才进行回调。(类似计数器)

list 参数是所有的异步结束之后触发事件传递的参数的数组,也就是 [content1,content2,content3...]

const ep = new EventProxy();
ep.after('got_file', files.length, (list) => {
  // 在所有文件的异步执行结束后将被执行
  // 所有文件的内容都存在list数组中
});
for (var i = 0; i < files.length; i++) {
  fs.readFile(files[i], 'utf-8', (err, content) => {
    // 触发结果事件
    ep.emit('got_file', content);
  });
}

3、ep.tail('tpl',(tpl)=>{}) 持续型异步协作

如果需要持续的进行异步操作,比如定时器进行异步操作:

const ep = new EventProxy();
ep.tail('got_file',(content)=>{});

setInterval(()=>{
    fs.readFile('readme.md', 'utf-8', (err, content) => {
    ep.emit('got_file', content);
  });
},1000);

三、异常处理

  function errHandle(err){} 
  const ep = new EventProxy();
  ep.all('tpl', 'data', function (tpl, data) {
    // 成功回调
    callback(null, {
      template: tpl,
      data: data
    });
  });

  ep.fail(callback);

  fs.readFile('template.tpl', 'utf-8', ep.done('tpl'));
  db.get('some sql', ep.done('data'));

其中异常处理使用:ep.fail(callback)

不同的地方在于,在进行事件触发的时候,使用的是 ep.done('tpl')

关于 faildone 更多细节,可以看 eventproxy 的文档部分: