用 WithTime 类履行 asyncFunc 函数,并经由过程调用 console.time 和 console.timeEnd 申报该asyncFunc 所花费的时光。它在履行之前和之后都将以精确的次序触发响应的事宜,并且还会发出 error/data 事宜作为处理异步调用的旌旗灯号。
我们传递一个异步的 fs.readFile 函数来测试一下 withTime emitter。 我们如今可以直接经由过程监听 data 事沂攀来处理攫取到的文件数据,而不消把这套处理逻辑写到 fs.readFile 的回调函数中。
履行这段代码,我们以预期的次序履行了一系列事宜,并且获得异步函数的履行时光,这些是十分重要的。
- About to execute
- execute: 4.507ms
- Done with execute
请留意,我们是将回调与事宜触发器 emitter 相结合实现的┞封部分功能。 如不雅 asynFunc 支撑Promise,我们可以应用 async/await 函数来做同样的工作:
我认为这段代码比之前的回调风格的代码以及应用 .then/.catch 风格的代码更具可读性。async/await 让我们加倍接近 JavaScript 说话本身(不必再应用 .then/.catch 这些 api)。
事宜参数和缺点
在之前的例子中,有两个事宜被发出时还携带了其余参数。
error 事宜被触发时会携带一个 error 对象。
- this.emit('error', err);
- this.emit('data', data);
我们可以在 emit 函数中赓续的添加参数,当然第一个参数必定是事宜的名称,除去第一个参数之外的所有参数都可以在该事宜注册的监听器中应用。
例如,要处理 data 事宜,我们注册的监听器函数将拜访传递给 emit 函数的 data 参数,而这个 data 也恰是由 asyncFunc 返回的数据。
- withTime.on('data', (data) => {
- // do something with data
- });
举个因为缺点应用参数而造检法度榜样崩溃的例子:
- class WithTime extends EventEmitter {
- execute(asyncFunc, ...args) {
- console.time('execute');
- asyncFunc(...args, (err, data) => {
- if (err) {
- return this.emit('error', err); // Not Handled
- }
- console.timeEnd('execute');
- });
- }
- }
- const withTime = new WithTime();
- withTime.execute(fs.readFile, ''); // BAD CALL
- withTime.execute(fs.readFile, __filename);
推荐阅读
市纪委经由过程对大年夜数据云与干部填报的家庭房产等情况的量化数据比对,敏捷排查出漏报瞒报人员,进而大年夜干部工作、生活相干事项着手,抓早抓小、大年夜严监管,教导抢救了大年夜批干部,起到了强大年夜的教导>>>详细阅读
本文标题:[译]理解Node.js事件驱动机制
地址:http://www.17bianji.com/lsqh/36743.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示