【问题标题】:How to Capture events / Listen / Observe to events emitted from Inner functions in nodejs?如何捕获事件/侦听/观察从 nodejs 中的内部函数发出的事件?
【发布时间】:2020-11-10 05:53:08
【问题描述】:

我想在函数中运行一堆代码 - 以及在这些函数中调用的函数,并在没有太多工作的情况下“冒泡”事件。

注意:我正在尝试远离 OOP,更多地转向函数式编程,因此我不能使用类实现事件发射器。我不确定我是否必须这样做

  • 从每个对象公开事件发射器 - 或
  • 如果我可以从内部函数之一发出并监视外部函数中的事件 - 或
  • 甚至只是将发射器作为函数参数传递。

obj2.ts

import {EventEmitter} from 'events'

export async function obj2(){
    const ev = new EventEmitter()
    ev.emit('test','Yahoo!')
    await new Promise(r => setTimeout(r, 2000));
    ev.emit('test2','Yahoo! - second time')
    ev.emit('test','Yahoo!')
    await new Promise(r => setTimeout(r, 10000));
    ev.emit('test2','Yahoo! - third time')
}

obj1.ts

import {EventEmitter} from 'events'
import { inherits } from 'util'
import {obj2} from './obj2'

async function obj1(){
     await obj2()    
}

inherits(obj1, EventEmitter)

export {obj1}

index.js(入口点)

import {obj1} from './obj1'

obj1.on('test', () => { // << this doesn't work obviously 
    //console.log(this)
    console.log('**')
})

obj1()

【问题讨论】:

    标签: node.js eventemitter


    【解决方案1】:

    不知道为什么需要obj1 - 你可以从obj2 导出EventEmitter 并监听返回的对象:

    在 obj2.js 中:

    import {EventEmitter} from 'events'
    
    export const obj2EventEmitter = new EventEmitter();
    export async function startEmitting(){
        obj2EventEmitter.emit('test','Yahoo!')
        await new Promise(r => setTimeout(r, 2000));
        obj2EventEmitter.emit('test2','Yahoo! - second time')
        obj2EventEmitter.emit('test','Yahoo!')
        await new Promise(r => setTimeout(r, 10000));
        obj2EventEmitter.emit('test2','Yahoo! - third time')
    }
    

    在你的 index.js 中:

    import {obj2EventEmitter, startEmitting} from './obj2';
    
    obj2EventEmitter.on('test', () => {
        console.log('**')
    });
    
    (async () => {
        await startEmitting();
    })()
    

    【讨论】:

    • 它是一个概念——这就是我想要 obj1 的原因——它是为了看看我是否需要在所有地方都有一个事件发射器对象,我将事件发射到表面
    • 你需要传递发射器对象才能附加到它。或者,您可以提供一个接口来附加到它。例如。您可以在 obj1 模块中创建一个函数,该函数接受事件名称和回调并委托给发射器对象。这能回答你的问题吗?
    猜你喜欢
    • 2020-01-18
    • 1970-01-01
    • 2020-09-06
    • 2018-02-26
    • 1970-01-01
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多