我一直在练习以下结构:
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!
})
这可能吗?