У меня есть компонент React с некоторым кодом, подобным следующему:
class MyComponent extends React.Component {
// ...
trackStats = false
componentDidMount() {
this.monitorActivity()
}
componentWillUnmount() {
this.trackStats = false
}
async monitorActivity() {
this.trackStats = true
while (this.trackStats && this.elRef.current) {
// elRef is a React ref to a DOM element rendered in render()
await Promise.race([
nextEvent(this.elRef.current, 'keydown'),
nextEvent(this.elRef.current, 'click'),
nextEvent(this.elRef.current, 'mousemove'),
nextEvent(this.elRef.current, 'pointermove'),
])
this.logUserActivity()
}
}
logUserActivity() {
// ...
}
render() { /* ... */ }
}
const nextEvent = (target, eventName) => new Promise(resolve => {
target.addEventListener(eventName, resolve, { once: true })
})
Проблема в том, что если этот компонент отключен, то обработчики событий, которые добавляются в элемент DOM, на который ссылается this.elRef.current
останется в памяти, так как пользователь больше не будет взаимодействовать с элементом, которого больше нет в DOM.
Так что цикл while будет зависать в ожидании следующих событий, которые никогда не произойдут, ипоскольку цикл while все еще ожидает одно последнее событие, я полагаю, что это приведет к утечке экземпляра MyComponent
в память.
Или движок достаточно умен, чтобы это очистить?Если у меня нет доступных ссылок на какие-либо из этих вещей, и единственное, что связано, - это область цикла while, которая ожидает выполнения некоторых обещаний, каждый движок откажется от нее?Или он оставит работоспособным цикл while, ожидая Обещания?
Если цикл while остается (что, я предполагаю, он делает), как мне его очистить?