Я работаю с React.js в браузере. И в настоящее время у нас есть библиотека, которая работает со слайдером, у которого есть внутренний setTimeout.
Я хотел бы сделать
window.cleartimeout(ID from internal library set timeout)
Есть ли способ получить тайм-ауты текущей страницы и очистить последний примененный тайм-аут, не обращаясь к библиотеке с запросом на включение, чтобы раскрыть этот идентификатор?
Это очень плохо, я подумал, что это может быть проблемой, с которой многие люди сталкивались раньше, и контроль над таймерами или эффектами, предоставляемыми из библиотеки, должен быть чем-то, с чем страница должна позволять мне работать ... так же, как я делаю окно .document.body, и я обращаюсь к телу, я должен иметь возможность сказать window.document.timers и получить хотя бы таймеры в стеке
Вы всегда можете инициализировать window.timers = [], а затем window.timers.push(setTimeout(...)). Хотя причина, по которой это еще не сделано, заключается в том, что сохранение ссылки на такой таймер потенциально может привести к тому, что большая часть больше не используемой памяти никогда не будет собрана в мусор. Также как определить таймер который для остановки? Если вы сделаете это явно, то у вас есть шанс придумать схему именования.
Что ж, да, я понимаю вашу точку зрения, но опять же, сбор мусора / схемы или способы определения того, кто предоставил слушателя, - это то, что мы тоже можем проверить. То есть с простой кнопкой этого не происходит? у вас также есть button.events, и вы можете увидеть там событие ... но я не вижу чего-то подобного в случае с таймерами. И я думаю, что это связано с утечками памяти или ошибками, когда что-то поступает из библиотек ... Мы должны уметь справляться с этими ситуациями без утечки памяти или ошибок ...
@SergiuParaschiv setTimeout возвращает идентификатор, а не ссылку на таймер. Проблем с сборщиком мусора не будет.
@Oram Действительно, это удостоверение личности, а не ссылка, моя беда.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Можно переписать функцию setTimeout.
window.timers = [];
window._setTimeout = window.setTimeout;
window.setTimeout = function(f, delay) {
window.timers.push(window._setTimeout(f,delay));
};
Это даст вам список идентификаторов таймеров (это не остановит сборку таймеров).
Теперь ваша проблема будет заключаться в том, чтобы определить, какой идентификатор принадлежит какому таймеру ... Поэтому я предлагаю вам добавить некоторую отличительную информацию вместе с идентификатором таймера.
Предоставленное решение возможно, хотя оно приведет к переопределению текущей реализации setTimeout ... это должно выходить из коробки и поддерживаться самим браузером, с моей точки зрения, понятным образом ...
Может ты и прав, что он должен выйти из коробки. Но по крайней мере мы можем быть счастливы, что решение есть.
Я, вероятно, сделаю пиар для библиотеки, чтобы иметь возможность справиться с этим классным способом, но это также возможное решение, которое мне не пришло в голову, может быть, кто-то придет и скажет, что это поддерживается таким образом ... и тогда я буду счастливым человеком.
Нет. Вам нужно будет получить ссылку на возвращенный обработчик тайм-аута setTimeout.