Node.js EventEmitter:我可以绑定和侦听方法上的事件吗?

时间:2017-11-15 22:15:12

标签: javascript node.js javascript-events eventemitter

我一直在练习以下结构:

class ProductService extends EventEmitter {
    constructor() {
        super()
    }

    getProductById(id) {
        this.emit('beforeCall', { method: 'getProductById', params: { id }})
        return new Promise((resolve, reject) => {
            fetch(`/api/product/${id}`)
                .then((res) => {
                    this.emit('complete', { method: 'getProductById', params: { id }})
                    resolve(res)
                })
                .catch((err) => {
                    this.emit('error', { method: 'getProductById', params: { id }})
                    reject(err)
                })
        })
    }
}

样本用法是:

const productService = new ProductService()

productService.on('beforeCall', (e) => {
    if (e.method === 'getProductById') {
        // getProductById method call detected!
        if(e.params.id === 123) {
            // getProductById(123) call detected!
        }
    }
})

productService.getProductById(123)
    .then((res) => {
        // product details fetched!
    })

这一切都很好并且促进了事件驱动的架构,但我希望事件监听器可以更优雅。

我可能已经看到过将事件发射器绑定到与对象相反的方法的用法,用法看起来像这样:

const productService = new ProductService()
productService.getProductById(123)
    .on('beforeCall', (e) => {
        // getProductById(123) call detected!
    })
    .then((res) => {
        // product details fetched!
    })

这可能吗?

0 个答案:

没有答案