setTimeout
возвращает число, timeoutId, которое используется clearTimeout
для его идентификации и удаления.
Однако какое значение мне использовать, если я хочу установить тайм-аут условно? Является ли 0 безопасным идентификатором?
Он используется в контексте React, где очистка тайм-аута обычно считается хорошей практикой.
useEffect(() => {
const timeout = success ? setTimeout(() => foo(), 300) : defaultVal;
return () => clearTimeout(timeout);
}, [success]);
Или, возможно, лучше обернуть все это одним большим условием и вообще избежать значения по умолчанию?
useEffect(() => {
if (success)
const timeout = setTimeout(() => foo(), 300);
return () => clearTimeout(timeout);
}
}, [success]);
Да, 0 — это безопасное значение для использования, потому что оно никогда не будет возвращено пользователем setTimeout
:
... пусть id будет целым числом, определяемым реализацией, которое больше нуля ...
И это не ошибка передать 0 в clearTimeout
:
Шаги метода
clearTimeout(id)
[...] заключаются в том, чтобы удалить эту карту активных таймеров [id]....
Удаление записи из упорядоченной карты означает удаление из карты всех записей, которые соответствуют заданному условию, или ничего не делать, если ни одна не соответствует.
Но даже несмотря на то, что это безопасно и поддерживается, я обычно использую null
для этого случая. Это означает, что мне нужно проверить значение, отличное от null
, перед вызовом clearTimeout
, но это делает цель кода более понятной.
Я просмотрел спецификацию, но не смог найти раздел о том, что идентификатор не равен нулю, поэтому я подумал, что безопаснее спросить :)