Не ждите ... Отменяемый async setTimeout.

Это мой первый пост, добро пожаловать :) Решила кое-что написать. Будем надеяться, что это не последний мой пост;)

Я начал с JS, когда у нас были IE4 и Netscape Navigator 3, и все изменилось.

Когда я программирую асинхронный код на JavaScript, я ненавижу обещания и обратные вызовы.

Сегодня у нас есть даже типы, связанные с Typescript или Flow, а не с такими классными вещами, как async await, ведьма изначально работает в большинстве современных браузеров. Так что я думаю, что нашему другу setTimeout нужна настройка :). В Node у нас есть помощник promisify, который очень помогает. Мы можем реализовать это просто так:

В большинстве случаев этого достаточно, но есть одна проблема, у setTimeout есть друг, clearTimeout, и он требует значения, возвращаемого setTimeout. Это значение будет возвращено, когда обещание разрешится, но уже слишком поздно ...

Что мы можем сделать, так это добавить функцию отмены к нашей задержке:

Теперь у нас есть гораздо более приятный API. У нас нет числа, которое мы передаем, у нас есть функция, которую мы можем вызвать. Приведенный выше тест Jest действительно подтверждает, что await в waitFord1 никогда не разрешится.

В этом примере я использовал Typescript, но он пересылается в JS и выглядит так:

Конечно, можно сказать, что это большой объем кода для выполнения такой простой задачи, но он также более читабельный :)

Нравится / не нравится эта идея? комментарий ниже :)

Мир!