console.log('start');
if (timeout) {
clearTimeout(timeout);
}
timeout = setTimeout(() => console.log('end'), 2000);
}
типа колбэк, который запишет в clipboard значение, и удалит по таймауту.
stream$.pipe(debounceTime(2000))
А ваш код выполняет вашу задачу?
Мб вам просто switchMapTo(timer(2000)) нужен? Хотя по факту будет примерно то же самое, что debounceTime
да, но как правильно отписаться в таком случае? что бы таймер один раз отработал, если кнопку колбэк спамить будут?
От чего отписаться? debounce защитит от спама, а отписка у вас уже есть Если вам надо троттлить вызов onPasswordCopy, то тогда все это надо делать через сабжект (click)="subject.next()" subject.pipe(debounceTime(2000), takeUntil(?)).subscribe(() => doSmth())
нет. если я правильно понимаю тебя, не должно тут быть дебоунса/тротла. дебаунс просто не даст записать новое значение, но я не этого поведения хочу. кейс: нажал кнопку => колбэк записал значение в клипбоард и запустил таймер(1мин), что бы очистить значение. через 30 сек снова нажали кнопку => новое значение записано + новый таймер. а от старого не отписались и он через тридцать секунд очистит значение.
Зачем 2 таймера на очистку? mergeMap(() => timer(Time))
это я описал кейс, как не надо )
Я умываю руки, я не понимаю
up
switchMap(() => { console.log('start'); return timer(2000).pipe( tap(() => console.log('end')) ); })
почти да, пример не удачный, сорян. сейчас проблема в том, что console.log вызывается при каждом вызове onPasswordCopy (который просто висит на клике). а мне нужно, что бы при новом вызове старый таймер отменялся.
switchMap отменяет предыдущий таймер
да, но в моём коде сейчас получается новый switchMap при каждом вызове. как то можно отрефакторить без введения каких либо внешних переменных?
я думаю, что тут хорошо подойдет какой-нибудь ClipboardService, в котором не будет торчать наружу никаких Observable мы должны сказать этому сервису, чтобы он положил данные в буфер обмена и как дополнительно можно передать { dueTime: 2000 } а то, как это реализовано внутри сервиса — не так важно, но важно насколько этим легко пользоваться, например, clipboard.copy(text, { dueTime: 2000 }) выглядит сильно проще, чем то, что выше
Обсуждают сегодня