Page 236 - Браун Э. - Изучаем JavaScript. Руководство по созданию современных веб-сайтов - 2017
P. 236
обязательство будет выполнено, то оно будет выполнено только однократно; если
оно будет отклонено, то тоже только однажды. Как только обязательство было либо
выполнено, либо отклонено, оно считается завершенным (settled).
Еще одно преимущество обязательств по сравнению с обратными вызовами за
ключается в том, что, обязательства - это обычные объекты, которые легко можно
передать в другие функции. Если вы хотите начать асинхронный процесс, но пред
почли бы, чтобы результаты обрабатывал кто-то другой, можете просто передать
обязательство ему (это походило бы на передачу пейджера для резервирования сто
лика вашему другу - ресторан не будет возражать, ему безразлично, кто именно
получит столик, если количество посетителей за ним останется прежним).
Создан и е обязательств
Создание обязательств является простым делом: вам нужно создать новый экзем
пляр объекта Promise с функцией, которой передаются две функции обратного вы
j
зова resolve (выполнено) и re e ct (отклонено) (я предупреждал вас, что обязатель
ства не спасают от обратных вызовов!). Давайте возьмем нашу функцию countdown,
параметризируем ее (чтобы не зацикливаться только на 5-секундном обратным от
счете) и сделаем так, чтобы она возвратила обязательство, когда обратный отсчет
начнется.
function countdown ( s econds )
return new Promise ( function r esol ve , rej ect) {
(
for ( l et i=seconds ; i> O ; i-- )
=
setTimeout ( f unction ( ) {
if ( i > O ) console . l og ( i + ' . . . ' ) ;
else resolve ( c onsole . l og ( " C тapт ! " ) ) ;
( s econds i ) * 1 0 0 0 ) ;
-
} ,
} ) ;
Прямо сейчас эта функция не очень гибка. Дело в том, что нам не всегда требуется
вербальный вывод, более того, нам не всегда требуется выводить что-то на консоль.
Такой подход совершенно не годится, если мы планируем выводить информацию
на веб-странице, модифицируя соответствующий элемент DOM с помощью нашей
функции обратного отсчета. Но это только начало ... и демонстрация создания обя
зательств. Обратите внимание, что resol ve (как и rej ect) является функцией. Вы
могли бы подумать "Ха-ха! Я могу вызвать resolve несколько раз и нарушить ... обя
зательство обязательств': Вы действительно можете вызывать функции resol ve или
rej e ct многократно или даже попеременно ... но будет учитываться только их пер
вый вызов. Обязательство гарантирует, что кто бы его ни использовал, он получит
Обязатеnьства 239

