Page 243 - Браун Э. - Изучаем JavaScript. Руководство по созданию современных веб-сайтов - 2017
P. 243
Если вы уже говорите "Ого." функция, которая возвращает функцию, которая
возвращает обязательство, которое вызывает функцию, которая возвращает обя
зательство ... У меня уже голова кружится!': я могу вас понять: добавление периода
в возвращающую обязательство функцию не является тривиальной задачей и требу
ет напряжения всех извилин. Полное понимание этой функции является упражнени -
ем для "продвинутого" читателя. Однако использовать эту функцию весьма просто:
мы можем добавить период к любой функции, которая возвращает обязательство.
Скажем, наша самая медленная ракета достигает орбиты через 1 О секунд (разве не
прекрасны ракетные технологии будущего?). Таким образом, мы устанавливаем пе
1
риод на 1 секунд.
(
с . go )
. t hen ( addTimeout ( l aunch, 4 * 1 0 0 0 ) )
. t hen ( f unction (msg) {
console . l og (msg) ;
} )
. c atch ( f unction ( e rr) (
console . e rror ( "Xьюcтoн, у нас проблемы: " + err . m essag ) ;
e
} ) ;
Теперь наша цепь обязательств всегда будет завершаться, даже когда функция
launch ведет себя плохо.
Генераторы
1
Как уже обсуждалось в главе 2 , генераторы обеспечивают двухстороннюю связь
между функцией и ее вызывающей стороной. Г е нераторы синхронны по своей при
роде, но, будучи объединены с обязательствами, обеспечивают мощную технологию
для управления асинхронным кодом в JavaScript.
Давайте припомним главную сложность асинхронного кода: его труднее писать,
чем синхронный код. Когда мы решаем задачу, наш ум стремится свести ее к син
хронному виду: этап 1, этап 2, этап 3 и т.д. Однако при этом подходе могут быть про
блемы производительности, которых нет при асинхронном подходе. Разве не было
246 Глава 1 4 . Асинхронное программирование

