Page 228 - Браун Э. - Изучаем JavaScript. Руководство по созданию современных веб-сайтов - 2017
P. 228

1
                                                                           А
                                                                        ГЛ В А  4
                  А с и х р о н н о е   п р      о  г р а м м и р о а н и е
                                                                        в
                         н










          Мы упоминали асинхронное программирование в главе  ,   когда обсуждали взаи­
                                                             1
       модействие с пользователем. Помните, что взаимодействие с пользователем, вполне
       естественно, является асинхронным: вы не можете контролировать, когда пользо­
       ватель щелкнет, коснется, скажет или введет. Однако пользовательский ввод - не
       единственная  причина  для  асинхронного  выполнения  программ:  сама  природа
       JavaScript вынуждает к этому во многих случаях.
          Приложение JavaScript выполняется в одном  потоке (single-threaded). Таким об­
       разом, JavaScript делает только что-то одно за один раз. Большинство современных
       компьютеров способно выполнять одновременно несколько операций (подразумева­
       ется, что у них есть несколько ядер), и даже компьютеры с одним ядром настолько
       быстры, что могут имитировать одновременное выполнение нескольких задач, вы­
       полняя сначала часть задачи А, затем - небольшую часть задачи В, затем - задачи
       С и так до тех пор, пока все задачи не будут выполнены (это так называемый муль­
       типрограммный режим работы с приоритетами  (preemptive multitasking)). С точ­
       ки зрения пользователя, задачи А, В и С выполняются одновременно, как будто они
       фактически выполняются одновременно на нескольких ядрах.
          Таким  образом,  однопоточный  характер  движка JavaScript мог  бы  показаться
       ограничивающим фактором, но фактически это освобождает нас от заботы о некото­
       рых очень сложных проблемах, присущих многопоточному программированию. Эта
       свобода имеет цену: она означает, что для  написания  корректно выполняющегося
       программного обеспечения нужно мыслить асинхронно, и не только о пользователь­
       ском вводе. Поначалу так мыслить может быть трудно, особенно если вы переходите
       с языка программирования, в котором выполнение обычно происходит синхронно.
          В JavaScript с самого начала был заложен механизм для асинхронного выполнения
       программ. Однако по мере роста популярности JavaScript (и изощренности создавае­
       мого на нем программного обеспечения) в него были добавлены новые конструкции
       для асинхронного программирования. Фактически мы можем считать, что JavaScript
       имеет три разные фазы асинхронной поддержки: фазу обратного вызова, фазу обя­
       зательства и фазу генератора. Если бы это был вопрос только генераторов, ставших
       лучше, чем прежде, мы объяснили бы, как они работают, и двинулись бы дальше.
   223   224   225   226   227   228   229   230   231   232   233