Мой код React продолжает вызывать обратные вызовы EventEmitter, которые должны были быть удалены.Когда я проверял свой класс React, который расширяет EventEmiiter, я обнаружил, что обратные вызовы все еще присутствуют в полях events , хотя removeListener уже был вызван для этих обратных вызовов.
Я подозреваю, что это происходит, потому что я добавляю обратные вызовы к EventEmitter как функции стрелок, но когда я удаляю их, я не делаю.Удаление их как функции стрелок не работает.В моем коде ниже FirebaseStore расширяет EventEmitter:
_onFirebaseChange() {
this.setState({
refId: this.getRefId()
});
}
componentDidMount() {
FirebaseStore.addChangeListener(() => this._onFirebaseChange());
}
componentWillUnmount() {
FirebaseStore.removeChangeListener(this._onFirebaseChange);
}
Мне нужно использовать функции стрелок, потому что событиям изменения ( _onFirebaseChange ) требуется доступ к this.state .
Когда я смотрю на свой источник из инструментов разработчика Chrome, мне трудно определить, относятся ли addChangeListener и removeChangleListener к тому же обратному вызову:
key: 'componentDidMount',
value: function componentDidMount() {
var _this2 = this;
_FirebaseStore2.default.addChangeListener(function () {
return _this2._onFirebaseChange();
});
}
},{
key: 'componentWillUnmount',
value: function componentWillUnmount() {
_FirebaseStore2.default.removeChangeListener(this._onFirebaseChange);
}}
Вот соответствующий код из магазина Firebase:
addChangeListener(callback) {
this.on(FIREBASE_CHANGE_EVENT, callback);
}
removeChangeListener(callback) {
this.removeListener(FIREBASE_CHANGE_EVENT, callback);
}
}
Можно было бы исправить это с закрытием, но я думаю, что это излишне.