Так что в основном у меня есть асинхронный обратный вызов события, который иногда срабатывает довольно быстро.То, что я хочу сделать, - это выполнить некоторые методы прямо тогда, но затем подождать некоторое время после последнего четного вызова, прежде чем выполнить последний бит кода.
Вот пример:
let debounceTimeout
async function onEvent() {
// do stuff here on every event
const waitTime = 5000
await new Promise(resolve => {
clearTimeout(debounceTimeout)
debounceTimeout = setTimeout(resolve, waitTime)
})
// do stuff here only on the last event after waiting for "waitTime"
}
так что приведенный выше пример работает именно так, как я хочу, однако, остроумие, вы можете осознать все до того, как финальное событие будет «ожидаться» бесконечно, что (я предполагаю) является утечкой памяти, поскольку она сохранитсоздание новых обещаний, которые никогда не разрешаются.
По сути, мне интересно, есть ли какой-нибудь общий способ сделать денонсацию, которая является такой же функционально, но без утечки памяти.бонусные баллы, если их можно каким-то образом перевести в простой вызов await debounce(timeInMS)
.
PS Я подумал, может быть, что-то вроде отклонения таймаутов, которое никогда не будет решено, но я не уверен, что это будетбудь хорошим подходом.
PSS Я знаю, что то, что я спрашиваю, можно эффективно сделать, отслеживая события и проверяя, произошло ли новое после ожидания 5 секунд на этом, и если мне нужноидти по этому пути, пусть будет так.Тем не менее, это будет распространенный шаблон в приложении, над которым я работаю, и я хотел бы что-то немного чище, и надеялся, что эта идея не слишком много.