Page 228 - Браун Э. - Изучаем JavaScript. Руководство по созданию современных веб-сайтов - 2017
P. 228
1
А
ГЛ В А 4
А с и х р о н н о е п р о г р а м м и р о а н и е
в
н
Мы упоминали асинхронное программирование в главе , когда обсуждали взаи
1
модействие с пользователем. Помните, что взаимодействие с пользователем, вполне
естественно, является асинхронным: вы не можете контролировать, когда пользо
ватель щелкнет, коснется, скажет или введет. Однако пользовательский ввод - не
единственная причина для асинхронного выполнения программ: сама природа
JavaScript вынуждает к этому во многих случаях.
Приложение JavaScript выполняется в одном потоке (single-threaded). Таким об
разом, JavaScript делает только что-то одно за один раз. Большинство современных
компьютеров способно выполнять одновременно несколько операций (подразумева
ется, что у них есть несколько ядер), и даже компьютеры с одним ядром настолько
быстры, что могут имитировать одновременное выполнение нескольких задач, вы
полняя сначала часть задачи А, затем - небольшую часть задачи В, затем - задачи
С и так до тех пор, пока все задачи не будут выполнены (это так называемый муль
типрограммный режим работы с приоритетами (preemptive multitasking)). С точ
ки зрения пользователя, задачи А, В и С выполняются одновременно, как будто они
фактически выполняются одновременно на нескольких ядрах.
Таким образом, однопоточный характер движка JavaScript мог бы показаться
ограничивающим фактором, но фактически это освобождает нас от заботы о некото
рых очень сложных проблемах, присущих многопоточному программированию. Эта
свобода имеет цену: она означает, что для написания корректно выполняющегося
программного обеспечения нужно мыслить асинхронно, и не только о пользователь
ском вводе. Поначалу так мыслить может быть трудно, особенно если вы переходите
с языка программирования, в котором выполнение обычно происходит синхронно.
В JavaScript с самого начала был заложен механизм для асинхронного выполнения
программ. Однако по мере роста популярности JavaScript (и изощренности создавае
мого на нем программного обеспечения) в него были добавлены новые конструкции
для асинхронного программирования. Фактически мы можем считать, что JavaScript
имеет три разные фазы асинхронной поддержки: фазу обратного вызова, фазу обя
зательства и фазу генератора. Если бы это был вопрос только генераторов, ставших
лучше, чем прежде, мы объяснили бы, как они работают, и двинулись бы дальше.

