React FaceBook EventEmitter
Trong react việc liên kết giữa 2 component được thực hiện thông qua EventEmiter, việc hiểu rõ thêm gíup bạn sử dụng nó chủ động hơn. Ta có EventEmitter của NodeJS và của FaceBook. EventEmitter của NodeJS: https://nodejs.org/api/events.html EventEmitter của FaceBook: https://github.com/facebook/ ...
Trong react việc liên kết giữa 2 component được thực hiện thông qua EventEmiter, việc hiểu rõ thêm gíup bạn sử dụng nó chủ động hơn.
Ta có EventEmitter của NodeJS và của FaceBook.
EventEmitter của NodeJS: https://nodejs.org/api/events.html EventEmitter của FaceBook: https://github.com/facebook/emitter
NodeJS EventEmitter bao gồm khá nhiều method:
Event: 'newListener' Event: 'removeListener' EventEmitter.listenerCount(emitter, eventName) EventEmitter.defaultMaxListeners emitter.addListener(eventName, listener) emitter.emit(eventName[, ...args]) emitter.eventNames() emitter.getMaxListeners() emitter.listenerCount(eventName) emitter.listeners(eventName) emitter.on(eventName, listener) emitter.once(eventName, listener) emitter.prependListener(eventName, listener) emitter.prependOnceListener(eventName, listener) emitter.removeAllListeners([eventName]) emitter.removeListener(eventName, listener) emitter.setMaxListeners(n)
Facebook EventEmitter đơn gỉan và dễ sử dụng hơn.
Để tạo ra 1 listener ta có method addListener:
var emitter = new EventEmitter(); emitter.addListener('event', function(x, y) { console.log(x, y); });
method addListener được định nghĩa trong class BaseEventEmitter :
addListener( eventType: string, listener, context: ?Object): EmitterSubscription { return this._subscriber.addSubscription( eventType, new EmitterSubscription(this._subscriber, listener, context)); }
event là key của 1 Event được catch lại, mỗi khi muốn gọi function được add cùng Event có key là event ta có method emit:
emitter.emit('event', 5, 10); // Listener prints "5 10".
Gỉa sử ta có 1 OrderStore extends EventEmitter:
class OrderStore extends EventEmitter { constructor(Dispatcher) { super() ... } addListener(callback) { this.on("ChangeEvent") }
Khi console.log OrderStore ta sẽ thấy :
OrderStore events: Object ChangeEvent: ()arguments: ...
Nghĩa la 1 listener đã được lưu trong EventEmitter với tên gọi chính là type ta truyền vào.
Muốn remove các listener ta có hàm removeAllListeners:
emitter.removeAllListeners();
Muốn lấy ra các listeners đã được add vào ta có method listeners:
emitter.listeners();
Trong class BaseEventEmitter có định nghĩa method __emitToSubscription:
__emitToSubscription(subscription, eventType) { var args = Array.prototype.slice.call(arguments, 2); subscription.listener.apply(subscription.context, args); }
Khi ta muốn custom callback gắn liền với emit của EventEmitter, ta có thể extends EventEmitter rồi overide lại method trên:
class MyEventEmitter extends EventEmitter { __emitToSubscription(subscription, eventType) { var args = Array.prototype.slice.call(arguments, 2); var start = Date.now(); subscription.listener.apply(subscription.context, args); var time = Date.now() - start; MyLoggingUtility.log('callback-time', {eventType, time}); } }
Cảm ơn và hi vọng bài viết có ích trong công việc của bạn.