SlideShare a Scribd company logo
Андрей Кулешов




Асинхронный
JavaScript
Про стоящих в очереди и отсроченные обещания
Почему JavaScript вновь удивляет Си-
программистов...


▪ То, чему нас учили в институте
▪ Почему в яваскрипт всѐ совсем по другому.
Карта выполнения кода в Си-подобных
языках
                     ▪ Исполнение нашего кода может
                       быть прервано в любое время
                       соседним потоком кода
                     ▪ Чтобы безопасно использовать
                       несколько потоков, мы изучали
                       мьютексы, семафоры...
Карта выполнения JavaScript в web-браузерах




                           Посмотрели,
   Получили   Выполнили                  Остановили
                           есть ли ещѐ
    задачу      задачу                     работу
                             задачи



              Повторили.
Очередь выполнения
▪ Когда выполняется код JavaScript – он не может быть прерван никаким
  другим кодом
▪ Мы можем только уведомить движок, что мы хотели бы выполнить
  некоторый новый кусок кода, и поставить его в очередь выполнения
▪ Постановка в очередь выполнения – операция достаточно дорогая; кроме
  того, в браузерах ни при каких условиях не возможно мгновенное
  выполнение поставленного в очередь кода
Кто может ставить код в очередь?
▪ Пришедшие к браузеру из внешнего мира события:


- пришедший запрос (ответ) по сети
- события от пользователя (щелчки мышью, клавиатурный ввод... многое)
Событие перерисоки браузера – стоит в той же очереди (хотя, в современных
браузерах, и со значительно большим приоритетом)
▪ Из кода javascript:


- setTimeout, setInterval
Как работает setTimeout
▪ Не так, как в си-языках 
▪ Код внутри таймаута не выполняется через заданное время, а ставится в
  очередь выполенения. А выполняется, соответственно, по возможности.
▪ Код внутри setTimeout выполняется асинхронно, превращая вызывающую
  функцию в целом в асинхронную
Ну... это здорово?..
▪ В сферическом вакууме модель исполения яваскрипта была бы идеальной
▪ Большой плохой момент - взаимодействие с пользователем живет в том же
  самом потоке
▪ Пока выполняется JavaScript код – не будет производиться никакая
  отрисовка страницы (хотя современные браузеры зачастую всѐ же пытаются
  что-то рисовать...)
▪ Но уж совершенно точно не будут выполняться никакие события
  пользовательского интерфейса
Асинхронные функции
▪ Функция называется асинхронной, когда она откладывает своѐ выполнение
  (или выполнение следующих действий) и ставит его в очередь задач
▪ Наш код, который мы хотим выполнить после окончания функции Х,
  передается в функции Х как функция обратного вызова (callback)
Когда функции становятся асинхронными:
▪ В первую очередь –               ▪ Синхронная
  взаимодействующие с внешним        function load() {
  миром (читай – AJAX)                 var data = //(идём на сервер)
                                       //курим, ждём ответа
▪ Во вторую очередь – функции          return data ;
  реакции на события от              }
  пользователя                       var result = load();
                                     print(result)
▪ В третью очередь –
  долговременные функции,          ▪ Асинхронная
  блокирующие взаимодействие с       function load(callback) {
  пользователем – мы сами делаем         var data =
  их асинхронными                          goToServerBrowserFunction(
                                             callback);
                                         //и там внутри происходит
                                         //callback(someData)
                                     }
                                     load(function (result) {
                                         print(result);
                                     });
Асинхронный однажды – асинхронный всегда
▪ Всѐ функции, укушенные асинхронной функцией, сами становятся
  асинхронными
▪ Нет никакого пути вернуть асинхронную функцию в неасинхронный режим
Демо



▪ setTimeout(0)
▪ setTimeout(500) и цикл длиной в секунду
▪ создание большого количества элементов в синхронном режиме, в
  асинхронном режиме – поэлементно и в асинхронном режиме - группами
Шаблон отложенных обещаний
▪ deferred – шаблон проектирования javascipt кода
▪ Суть в двух словах: есть некоторое событие; когда оно выполнено – нужно
  выполнить наши обработчики этого события
▪ И нам неважно, наступило ли уже это событие или ещѐ нет
▪ Но нам обещают, что как только станет можно – нас позовут
jQuery $.Deffered
▪   Можно подписаться на его события
-   always
-   done
-   fail
▪ Им можно управлять
- resolve
- reject
▪ У него можно получить объект promise (“обещание”)
  у него такие же события, но им нельзя управлять
  Он нужн для того, чтобы отдать его наружу, из нашего класса, чтобы на него
  могли подписаться, но никто не мог управлять поведением вместо нас
Будет ли в JavaScript классическая
многопоточность?
▪ Нет, насколько это зависит от комитета ECMA
▪ Workers – единственная альтернатива в ближайшее время
Workers
▪ Отдельный файл с JavaScript-кодом, который может быть запущен в
  отдельном потоке
▪ Обмен данными с вызывающим кодом – только через механизм сообщений
  (подписка на события)
▪ Воркер не имеет доступа к вызывающему контексту (переменные и т.п.), не
  имеет доступа к DOM страницы
Есть ещѐ Node.js…
Но для докладчика это Terra Incognita
Интересное чтение
▪ Event loops in JS specification
▪ Async JavaScript: Build More Responsive Apps with Less Code by Trevor
  Burnham
▪ High Performance JavaScript by Nicholas C. Zakas
▪ StackOverflow – exceptions from the rule
Вопросы?
                 Внимательно слушаю! 


Андрей Кулешов

kaa-tula@ya.ru
    akuleshov.tula




Специально для http://GetDev.NET

More Related Content

What's hot

Юрий Насретдинов, Badoo
Юрий Насретдинов, BadooЮрий Насретдинов, Badoo
Юрий Насретдинов, Badoo
Ontico
 
Server Side Javascript (ru)
Server Side Javascript (ru)Server Side Javascript (ru)
Server Side Javascript (ru)
Bakyt Niyazov
 
Быстрый рендеринг с DOM шаблонизаторами / Борис Каплуновский (aviasales.ru)
Быстрый рендеринг с DOM шаблонизаторами / Борис Каплуновский (aviasales.ru)Быстрый рендеринг с DOM шаблонизаторами / Борис Каплуновский (aviasales.ru)
Быстрый рендеринг с DOM шаблонизаторами / Борис Каплуновский (aviasales.ru)
Ontico
 
#5 "React.js" Антон Артамонов
#5 "React.js" Антон Артамонов#5 "React.js" Антон Артамонов
#5 "React.js" Антон Артамонов
JSib
 
Prometheus мониторинг микросервисных приложений / Виталий Левченко
Prometheus мониторинг микросервисных приложений / Виталий ЛевченкоPrometheus мониторинг микросервисных приложений / Виталий Левченко
Prometheus мониторинг микросервисных приложений / Виталий Левченко
Ontico
 
Оптимизация производительности фронтенда / Игорь Алексеенко (HTML Academy)
Оптимизация производительности фронтенда / Игорь Алексеенко (HTML Academy)Оптимизация производительности фронтенда / Игорь Алексеенко (HTML Academy)
Оптимизация производительности фронтенда / Игорь Алексеенко (HTML Academy)
Ontico
 
Windows Azure & NodeJS Microsoft SWIT 2012
Windows Azure & NodeJS Microsoft SWIT 2012 Windows Azure & NodeJS Microsoft SWIT 2012
Windows Azure & NodeJS Microsoft SWIT 2012 Dmytro Mindra
 
Kubasov 1 7_deploy
Kubasov 1 7_deployKubasov 1 7_deploy
Kubasov 1 7_deploykuchinskaya
 
Курс Java-2016. Занятие 13. Spring
Курс Java-2016. Занятие 13. SpringКурс Java-2016. Занятие 13. Spring
Курс Java-2016. Занятие 13. Spring
7bits
 
Алексей Фомкин, Практическое применение Web Workers
Алексей Фомкин, Практическое применение Web WorkersАлексей Фомкин, Практическое применение Web Workers
Алексей Фомкин, Практическое применение Web Workers
Aleksey Fomkin
 
Курс Java-2016. Занятие 09. Web
Курс Java-2016. Занятие 09. WebКурс Java-2016. Занятие 09. Web
Курс Java-2016. Занятие 09. Web
7bits
 
Борис Каплуновский, Aviasales.ru
Борис Каплуновский, Aviasales.ruБорис Каплуновский, Aviasales.ru
Борис Каплуновский, Aviasales.ru
Ontico
 
Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Avi...
Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Avi...Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Avi...
Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Avi...
Ontico
 
Web performance 101 [GDG nsk webdev meetup #3]
Web performance 101 [GDG nsk webdev meetup #3]Web performance 101 [GDG nsk webdev meetup #3]
Web performance 101 [GDG nsk webdev meetup #3]
Eugene Chekan
 
Moscow DevOps meetup 18.05.13
Moscow DevOps meetup 18.05.13Moscow DevOps meetup 18.05.13
Moscow DevOps meetup 18.05.13Alex Chistyakov
 
CodeFest 2012. Евтухович И. — Как мы делали Групон
CodeFest 2012. Евтухович И. — Как мы делали ГрупонCodeFest 2012. Евтухович И. — Как мы делали Групон
CodeFest 2012. Евтухович И. — Как мы делали ГрупонCodeFest
 
Профилирование кода на C/C++ в *nix системах
Профилирование кода на C/C++ в *nix системахПрофилирование кода на C/C++ в *nix системах
Профилирование кода на C/C++ в *nix системах
Aleksander Alekseev
 
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 1...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 1...PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 1...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 1...
pgdayrussia
 
AngularJS
AngularJSAngularJS
AngularJS
GetDev.NET
 
Дорога к микросервисной архитектуре
Дорога к микросервисной архитектуреДорога к микросервисной архитектуре
Дорога к микросервисной архитектуре
CodeFest
 

What's hot (20)

Юрий Насретдинов, Badoo
Юрий Насретдинов, BadooЮрий Насретдинов, Badoo
Юрий Насретдинов, Badoo
 
Server Side Javascript (ru)
Server Side Javascript (ru)Server Side Javascript (ru)
Server Side Javascript (ru)
 
Быстрый рендеринг с DOM шаблонизаторами / Борис Каплуновский (aviasales.ru)
Быстрый рендеринг с DOM шаблонизаторами / Борис Каплуновский (aviasales.ru)Быстрый рендеринг с DOM шаблонизаторами / Борис Каплуновский (aviasales.ru)
Быстрый рендеринг с DOM шаблонизаторами / Борис Каплуновский (aviasales.ru)
 
#5 "React.js" Антон Артамонов
#5 "React.js" Антон Артамонов#5 "React.js" Антон Артамонов
#5 "React.js" Антон Артамонов
 
Prometheus мониторинг микросервисных приложений / Виталий Левченко
Prometheus мониторинг микросервисных приложений / Виталий ЛевченкоPrometheus мониторинг микросервисных приложений / Виталий Левченко
Prometheus мониторинг микросервисных приложений / Виталий Левченко
 
Оптимизация производительности фронтенда / Игорь Алексеенко (HTML Academy)
Оптимизация производительности фронтенда / Игорь Алексеенко (HTML Academy)Оптимизация производительности фронтенда / Игорь Алексеенко (HTML Academy)
Оптимизация производительности фронтенда / Игорь Алексеенко (HTML Academy)
 
Windows Azure & NodeJS Microsoft SWIT 2012
Windows Azure & NodeJS Microsoft SWIT 2012 Windows Azure & NodeJS Microsoft SWIT 2012
Windows Azure & NodeJS Microsoft SWIT 2012
 
Kubasov 1 7_deploy
Kubasov 1 7_deployKubasov 1 7_deploy
Kubasov 1 7_deploy
 
Курс Java-2016. Занятие 13. Spring
Курс Java-2016. Занятие 13. SpringКурс Java-2016. Занятие 13. Spring
Курс Java-2016. Занятие 13. Spring
 
Алексей Фомкин, Практическое применение Web Workers
Алексей Фомкин, Практическое применение Web WorkersАлексей Фомкин, Практическое применение Web Workers
Алексей Фомкин, Практическое применение Web Workers
 
Курс Java-2016. Занятие 09. Web
Курс Java-2016. Занятие 09. WebКурс Java-2016. Занятие 09. Web
Курс Java-2016. Занятие 09. Web
 
Борис Каплуновский, Aviasales.ru
Борис Каплуновский, Aviasales.ruБорис Каплуновский, Aviasales.ru
Борис Каплуновский, Aviasales.ru
 
Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Avi...
Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Avi...Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Avi...
Доменно специфичные базы данных и рассылка Aviasales, Борис Каплуновский (Avi...
 
Web performance 101 [GDG nsk webdev meetup #3]
Web performance 101 [GDG nsk webdev meetup #3]Web performance 101 [GDG nsk webdev meetup #3]
Web performance 101 [GDG nsk webdev meetup #3]
 
Moscow DevOps meetup 18.05.13
Moscow DevOps meetup 18.05.13Moscow DevOps meetup 18.05.13
Moscow DevOps meetup 18.05.13
 
CodeFest 2012. Евтухович И. — Как мы делали Групон
CodeFest 2012. Евтухович И. — Как мы делали ГрупонCodeFest 2012. Евтухович И. — Как мы делали Групон
CodeFest 2012. Евтухович И. — Как мы делали Групон
 
Профилирование кода на C/C++ в *nix системах
Профилирование кода на C/C++ в *nix системахПрофилирование кода на C/C++ в *nix системах
Профилирование кода на C/C++ в *nix системах
 
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 1...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 1...PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 1...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 1...
 
AngularJS
AngularJSAngularJS
AngularJS
 
Дорога к микросервисной архитектуре
Дорога к микросервисной архитектуреДорога к микросервисной архитектуре
Дорога к микросервисной архитектуре
 

Viewers also liked

PhoneGap для мобильного разработчика - глубокое погружение без ОЗК
PhoneGap для мобильного разработчика - глубокое погружение без ОЗКPhoneGap для мобильного разработчика - глубокое погружение без ОЗК
PhoneGap для мобильного разработчика - глубокое погружение без ОЗК
GetDev.NET
 
Kh21345
Kh21345Kh21345
Kh21345
Suwardi St
 
WinRT
WinRTWinRT
WinRT
GetDev.NET
 
Что нового в Visual Studio 2015
Что нового в Visual Studio 2015Что нового в Visual Studio 2015
Что нового в Visual Studio 2015
GetDev.NET
 
Что нового в Visual Studio 2013
Что нового в Visual Studio 2013Что нового в Visual Studio 2013
Что нового в Visual Studio 2013
GetDev.NET
 
ASP.NET Web API
ASP.NET Web APIASP.NET Web API
ASP.NET Web API
GetDev.NET
 
Docker контейнерная революция
Docker контейнерная революцияDocker контейнерная революция
Docker контейнерная революция
GetDev.NET
 
Performance management case study ch#5
Performance management case study ch#5Performance management case study ch#5
Performance management case study ch#5zaman rana
 
TypeScript
TypeScriptTypeScript
TypeScript
GetDev.NET
 
Caps Rule
Caps RuleCaps Rule
Caps Rule
Shivani Ramnath
 
Slide share payment for pro v2
Slide share payment for pro v2Slide share payment for pro v2
Slide share payment for pro v2Shivani Ramnath
 
Test presentation
Test presentationTest presentation
Test presentation
Shivani Ramnath
 
Видео в сети
Видео в сетиВидео в сети
Видео в сети
GetDev.NET
 
Reactive Extensions
Reactive ExtensionsReactive Extensions
Reactive Extensions
GetDev.NET
 
Erlang
ErlangErlang
Erlang
GetDev.NET
 
"Robotmaatjes op een pg afdeling" - Claire Huijnen en Arie Maas, Zorg&ICT 2013
"Robotmaatjes op een pg afdeling" - Claire Huijnen en Arie Maas, Zorg&ICT 2013"Robotmaatjes op een pg afdeling" - Claire Huijnen en Arie Maas, Zorg&ICT 2013
"Robotmaatjes op een pg afdeling" - Claire Huijnen en Arie Maas, Zorg&ICT 2013
Claire Huijnen
 
Менеджер пакетов NuGet
Менеджер пакетов NuGetМенеджер пакетов NuGet
Менеджер пакетов NuGet
GetDev.NET
 
Leap Motion - игрушка с заделом на будущее
Leap Motion - игрушка с заделом на будущееLeap Motion - игрушка с заделом на будущее
Leap Motion - игрушка с заделом на будущее
GetDev.NET
 
Создание повторно используемых бизнес моделей с помощью технологии Domain Com...
Создание повторно используемых бизнес моделей с помощью технологии Domain Com...Создание повторно используемых бизнес моделей с помощью технологии Domain Com...
Создание повторно используемых бизнес моделей с помощью технологии Domain Com...
GetDev.NET
 
Getting Started With SlideShare
Getting Started With SlideShareGetting Started With SlideShare
Getting Started With SlideShare
Shivani Ramnath
 

Viewers also liked (20)

PhoneGap для мобильного разработчика - глубокое погружение без ОЗК
PhoneGap для мобильного разработчика - глубокое погружение без ОЗКPhoneGap для мобильного разработчика - глубокое погружение без ОЗК
PhoneGap для мобильного разработчика - глубокое погружение без ОЗК
 
Kh21345
Kh21345Kh21345
Kh21345
 
WinRT
WinRTWinRT
WinRT
 
Что нового в Visual Studio 2015
Что нового в Visual Studio 2015Что нового в Visual Studio 2015
Что нового в Visual Studio 2015
 
Что нового в Visual Studio 2013
Что нового в Visual Studio 2013Что нового в Visual Studio 2013
Что нового в Visual Studio 2013
 
ASP.NET Web API
ASP.NET Web APIASP.NET Web API
ASP.NET Web API
 
Docker контейнерная революция
Docker контейнерная революцияDocker контейнерная революция
Docker контейнерная революция
 
Performance management case study ch#5
Performance management case study ch#5Performance management case study ch#5
Performance management case study ch#5
 
TypeScript
TypeScriptTypeScript
TypeScript
 
Caps Rule
Caps RuleCaps Rule
Caps Rule
 
Slide share payment for pro v2
Slide share payment for pro v2Slide share payment for pro v2
Slide share payment for pro v2
 
Test presentation
Test presentationTest presentation
Test presentation
 
Видео в сети
Видео в сетиВидео в сети
Видео в сети
 
Reactive Extensions
Reactive ExtensionsReactive Extensions
Reactive Extensions
 
Erlang
ErlangErlang
Erlang
 
"Robotmaatjes op een pg afdeling" - Claire Huijnen en Arie Maas, Zorg&ICT 2013
"Robotmaatjes op een pg afdeling" - Claire Huijnen en Arie Maas, Zorg&ICT 2013"Robotmaatjes op een pg afdeling" - Claire Huijnen en Arie Maas, Zorg&ICT 2013
"Robotmaatjes op een pg afdeling" - Claire Huijnen en Arie Maas, Zorg&ICT 2013
 
Менеджер пакетов NuGet
Менеджер пакетов NuGetМенеджер пакетов NuGet
Менеджер пакетов NuGet
 
Leap Motion - игрушка с заделом на будущее
Leap Motion - игрушка с заделом на будущееLeap Motion - игрушка с заделом на будущее
Leap Motion - игрушка с заделом на будущее
 
Создание повторно используемых бизнес моделей с помощью технологии Domain Com...
Создание повторно используемых бизнес моделей с помощью технологии Domain Com...Создание повторно используемых бизнес моделей с помощью технологии Domain Com...
Создание повторно используемых бизнес моделей с помощью технологии Domain Com...
 
Getting Started With SlideShare
Getting Started With SlideShareGetting Started With SlideShare
Getting Started With SlideShare
 

Similar to Async Javascript

JavaScript: хороший тон клиентской разработки
JavaScript: хороший тон клиентской разработкиJavaScript: хороший тон клиентской разработки
JavaScript: хороший тон клиентской разработки
GetDev.NET
 
Performance optimisation in javascript
Performance optimisation in javascriptPerformance optimisation in javascript
Performance optimisation in javascript
Артем Захарченко
 
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
Омские ИТ-субботники
 
ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS
Pavel Tsukanov
 
Распределённое нагрузочное тестирование на Java
Распределённое нагрузочное тестирование на JavaРаспределённое нагрузочное тестирование на Java
Распределённое нагрузочное тестирование на Java
aragozin
 
Windows Azure and node js
Windows Azure and node jsWindows Azure and node js
Windows Azure and node js
Alex Tumanoff
 
JavaScript & modern scala backend
JavaScript & modern scala backendJavaScript & modern scala backend
JavaScript & modern scala backendGeeksLab Odessa
 
Сергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3CСергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3C
Yandex
 
Javascript in modern scala backend. [russian]
Javascript in modern scala backend.  [russian]  Javascript in modern scala backend.  [russian]
Javascript in modern scala backend. [russian] Ruslan Shevchenko
 
Expert Java Day: Java concurrency
Expert Java Day: Java concurrencyExpert Java Day: Java concurrency
Expert Java Day: Java concurrency
Pavel Titkov
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPI
Timur Shemsedinov
 
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
Yandex
 
Система обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyСистема обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyRegn
 
Семь тысяч Rps, один go
Семь тысяч Rps, один goСемь тысяч Rps, один go
Семь тысяч Rps, один go
Badoo Development
 
Управление памятью в CPython
Управление памятью в CPythonУправление памятью в CPython
Управление памятью в CPython
Anton Patrushev
 
Java 9 - кратко о новом
Java 9 -  кратко о новомJava 9 -  кратко о новом
Java 9 - кратко о новом
Леонид Ставила
 
Lift, play, akka, rails part1
Lift, play, akka, rails part1Lift, play, akka, rails part1
Lift, play, akka, rails part1Eduard Antsupov
 
Java Platform Performance BoF
Java Platform Performance BoFJava Platform Performance BoF
Java Platform Performance BoFDmitry Buzdin
 
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
Badoo Development
 
Git in Sky presentation @ HighLoad++ 2013
Git in Sky presentation @ HighLoad++ 2013Git in Sky presentation @ HighLoad++ 2013
Git in Sky presentation @ HighLoad++ 2013Serguei Gitinsky
 

Similar to Async Javascript (20)

JavaScript: хороший тон клиентской разработки
JavaScript: хороший тон клиентской разработкиJavaScript: хороший тон клиентской разработки
JavaScript: хороший тон клиентской разработки
 
Performance optimisation in javascript
Performance optimisation in javascriptPerformance optimisation in javascript
Performance optimisation in javascript
 
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
 
ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS ВВЕДЕНИЕ В NODE.JS
ВВЕДЕНИЕ В NODE.JS
 
Распределённое нагрузочное тестирование на Java
Распределённое нагрузочное тестирование на JavaРаспределённое нагрузочное тестирование на Java
Распределённое нагрузочное тестирование на Java
 
Windows Azure and node js
Windows Azure and node jsWindows Azure and node js
Windows Azure and node js
 
JavaScript & modern scala backend
JavaScript & modern scala backendJavaScript & modern scala backend
JavaScript & modern scala backend
 
Сергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3CСергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3C
 
Javascript in modern scala backend. [russian]
Javascript in modern scala backend.  [russian]  Javascript in modern scala backend.  [russian]
Javascript in modern scala backend. [russian]
 
Expert Java Day: Java concurrency
Expert Java Day: Java concurrencyExpert Java Day: Java concurrency
Expert Java Day: Java concurrency
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPI
 
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
FrontTalks: Алексей Андросов (Яндекс), «Ошибки, которые мы любим»
 
Система обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на GroovyСистема обработки бизнес-логики server-side приложения на Groovy
Система обработки бизнес-логики server-side приложения на Groovy
 
Семь тысяч Rps, один go
Семь тысяч Rps, один goСемь тысяч Rps, один go
Семь тысяч Rps, один go
 
Управление памятью в CPython
Управление памятью в CPythonУправление памятью в CPython
Управление памятью в CPython
 
Java 9 - кратко о новом
Java 9 -  кратко о новомJava 9 -  кратко о новом
Java 9 - кратко о новом
 
Lift, play, akka, rails part1
Lift, play, akka, rails part1Lift, play, akka, rails part1
Lift, play, akka, rails part1
 
Java Platform Performance BoF
Java Platform Performance BoFJava Platform Performance BoF
Java Platform Performance BoF
 
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
Badoo в облаках. Решение для запуска cli-скриптов в облаке собственной разраб...
 
Git in Sky presentation @ HighLoad++ 2013
Git in Sky presentation @ HighLoad++ 2013Git in Sky presentation @ HighLoad++ 2013
Git in Sky presentation @ HighLoad++ 2013
 

More from GetDev.NET

Go
GoGo
Гирлянда для программистов
Гирлянда для программистовГирлянда для программистов
Гирлянда для программистов
GetDev.NET
 
Mind Mapping, или как заставить свой мозг работать лучше
Mind Mapping, или как заставить свой мозг работать лучшеMind Mapping, или как заставить свой мозг работать лучше
Mind Mapping, или как заставить свой мозг работать лучше
GetDev.NET
 
Windows 10 для пользователей и разработчиков
Windows 10 для пользователей и разработчиковWindows 10 для пользователей и разработчиков
Windows 10 для пользователей и разработчиков
GetDev.NET
 
Lego Mindstorms
Lego MindstormsLego Mindstorms
Lego Mindstorms
GetDev.NET
 
Особенности мобильной платформы Windows Phone 8
Особенности мобильной платформы Windows Phone 8Особенности мобильной платформы Windows Phone 8
Особенности мобильной платформы Windows Phone 8
GetDev.NET
 
XAML - язык разметки приложений
XAML - язык разметки приложенийXAML - язык разметки приложений
XAML - язык разметки приложений
GetDev.NET
 
Dynamic Language Runtime
Dynamic Language RuntimeDynamic Language Runtime
Dynamic Language Runtime
GetDev.NET
 
Roslyn - компилятор как сервис
Roslyn - компилятор как сервисRoslyn - компилятор как сервис
Roslyn - компилятор как сервис
GetDev.NET
 
ASP.NET MVC 4
ASP.NET MVC 4ASP.NET MVC 4
ASP.NET MVC 4
GetDev.NET
 
ASP.NET, MVC, ASP.NET MVC
ASP.NET, MVC, ASP.NET MVCASP.NET, MVC, ASP.NET MVC
ASP.NET, MVC, ASP.NET MVC
GetDev.NET
 
Обзор рекомендаций W3C
Обзор рекомендаций W3CОбзор рекомендаций W3C
Обзор рекомендаций W3CGetDev.NET
 
PowerShell
PowerShellPowerShell
PowerShell
GetDev.NET
 
Первое знакомство с MODx revolution
Первое знакомство с MODx revolutionПервое знакомство с MODx revolution
Первое знакомство с MODx revolution
GetDev.NET
 
Dependency injection
Dependency injectionDependency injection
Dependency injection
GetDev.NET
 
Web deployment
Web deploymentWeb deployment
Web deployment
GetDev.NET
 
Microsoft NUI - Surface
Microsoft NUI - SurfaceMicrosoft NUI - Surface
Microsoft NUI - Surface
GetDev.NET
 
Microsoft NUI - Kinect
Microsoft NUI - KinectMicrosoft NUI - Kinect
Microsoft NUI - Kinect
GetDev.NET
 

More from GetDev.NET (18)

Go
GoGo
Go
 
Гирлянда для программистов
Гирлянда для программистовГирлянда для программистов
Гирлянда для программистов
 
Mind Mapping, или как заставить свой мозг работать лучше
Mind Mapping, или как заставить свой мозг работать лучшеMind Mapping, или как заставить свой мозг работать лучше
Mind Mapping, или как заставить свой мозг работать лучше
 
Windows 10 для пользователей и разработчиков
Windows 10 для пользователей и разработчиковWindows 10 для пользователей и разработчиков
Windows 10 для пользователей и разработчиков
 
Lego Mindstorms
Lego MindstormsLego Mindstorms
Lego Mindstorms
 
Особенности мобильной платформы Windows Phone 8
Особенности мобильной платформы Windows Phone 8Особенности мобильной платформы Windows Phone 8
Особенности мобильной платформы Windows Phone 8
 
XAML - язык разметки приложений
XAML - язык разметки приложенийXAML - язык разметки приложений
XAML - язык разметки приложений
 
Dynamic Language Runtime
Dynamic Language RuntimeDynamic Language Runtime
Dynamic Language Runtime
 
Roslyn - компилятор как сервис
Roslyn - компилятор как сервисRoslyn - компилятор как сервис
Roslyn - компилятор как сервис
 
ASP.NET MVC 4
ASP.NET MVC 4ASP.NET MVC 4
ASP.NET MVC 4
 
ASP.NET, MVC, ASP.NET MVC
ASP.NET, MVC, ASP.NET MVCASP.NET, MVC, ASP.NET MVC
ASP.NET, MVC, ASP.NET MVC
 
Обзор рекомендаций W3C
Обзор рекомендаций W3CОбзор рекомендаций W3C
Обзор рекомендаций W3C
 
PowerShell
PowerShellPowerShell
PowerShell
 
Первое знакомство с MODx revolution
Первое знакомство с MODx revolutionПервое знакомство с MODx revolution
Первое знакомство с MODx revolution
 
Dependency injection
Dependency injectionDependency injection
Dependency injection
 
Web deployment
Web deploymentWeb deployment
Web deployment
 
Microsoft NUI - Surface
Microsoft NUI - SurfaceMicrosoft NUI - Surface
Microsoft NUI - Surface
 
Microsoft NUI - Kinect
Microsoft NUI - KinectMicrosoft NUI - Kinect
Microsoft NUI - Kinect
 

Async Javascript

  • 1. Андрей Кулешов Асинхронный JavaScript Про стоящих в очереди и отсроченные обещания
  • 2. Почему JavaScript вновь удивляет Си- программистов... ▪ То, чему нас учили в институте ▪ Почему в яваскрипт всѐ совсем по другому.
  • 3. Карта выполнения кода в Си-подобных языках ▪ Исполнение нашего кода может быть прервано в любое время соседним потоком кода ▪ Чтобы безопасно использовать несколько потоков, мы изучали мьютексы, семафоры...
  • 4. Карта выполнения JavaScript в web-браузерах Посмотрели, Получили Выполнили Остановили есть ли ещѐ задачу задачу работу задачи Повторили.
  • 5. Очередь выполнения ▪ Когда выполняется код JavaScript – он не может быть прерван никаким другим кодом ▪ Мы можем только уведомить движок, что мы хотели бы выполнить некоторый новый кусок кода, и поставить его в очередь выполнения ▪ Постановка в очередь выполнения – операция достаточно дорогая; кроме того, в браузерах ни при каких условиях не возможно мгновенное выполнение поставленного в очередь кода
  • 6. Кто может ставить код в очередь? ▪ Пришедшие к браузеру из внешнего мира события: - пришедший запрос (ответ) по сети - события от пользователя (щелчки мышью, клавиатурный ввод... многое) Событие перерисоки браузера – стоит в той же очереди (хотя, в современных браузерах, и со значительно большим приоритетом) ▪ Из кода javascript: - setTimeout, setInterval
  • 7. Как работает setTimeout ▪ Не так, как в си-языках  ▪ Код внутри таймаута не выполняется через заданное время, а ставится в очередь выполенения. А выполняется, соответственно, по возможности. ▪ Код внутри setTimeout выполняется асинхронно, превращая вызывающую функцию в целом в асинхронную
  • 8. Ну... это здорово?.. ▪ В сферическом вакууме модель исполения яваскрипта была бы идеальной ▪ Большой плохой момент - взаимодействие с пользователем живет в том же самом потоке ▪ Пока выполняется JavaScript код – не будет производиться никакая отрисовка страницы (хотя современные браузеры зачастую всѐ же пытаются что-то рисовать...) ▪ Но уж совершенно точно не будут выполняться никакие события пользовательского интерфейса
  • 9. Асинхронные функции ▪ Функция называется асинхронной, когда она откладывает своѐ выполнение (или выполнение следующих действий) и ставит его в очередь задач ▪ Наш код, который мы хотим выполнить после окончания функции Х, передается в функции Х как функция обратного вызова (callback)
  • 10. Когда функции становятся асинхронными: ▪ В первую очередь – ▪ Синхронная взаимодействующие с внешним function load() { миром (читай – AJAX) var data = //(идём на сервер) //курим, ждём ответа ▪ Во вторую очередь – функции return data ; реакции на события от } пользователя var result = load(); print(result) ▪ В третью очередь – долговременные функции, ▪ Асинхронная блокирующие взаимодействие с function load(callback) { пользователем – мы сами делаем var data = их асинхронными goToServerBrowserFunction( callback); //и там внутри происходит //callback(someData) } load(function (result) { print(result); });
  • 11. Асинхронный однажды – асинхронный всегда ▪ Всѐ функции, укушенные асинхронной функцией, сами становятся асинхронными ▪ Нет никакого пути вернуть асинхронную функцию в неасинхронный режим
  • 12. Демо ▪ setTimeout(0) ▪ setTimeout(500) и цикл длиной в секунду ▪ создание большого количества элементов в синхронном режиме, в асинхронном режиме – поэлементно и в асинхронном режиме - группами
  • 13. Шаблон отложенных обещаний ▪ deferred – шаблон проектирования javascipt кода ▪ Суть в двух словах: есть некоторое событие; когда оно выполнено – нужно выполнить наши обработчики этого события ▪ И нам неважно, наступило ли уже это событие или ещѐ нет ▪ Но нам обещают, что как только станет можно – нас позовут
  • 14. jQuery $.Deffered ▪ Можно подписаться на его события - always - done - fail ▪ Им можно управлять - resolve - reject ▪ У него можно получить объект promise (“обещание”) у него такие же события, но им нельзя управлять Он нужн для того, чтобы отдать его наружу, из нашего класса, чтобы на него могли подписаться, но никто не мог управлять поведением вместо нас
  • 15. Будет ли в JavaScript классическая многопоточность? ▪ Нет, насколько это зависит от комитета ECMA ▪ Workers – единственная альтернатива в ближайшее время
  • 16. Workers ▪ Отдельный файл с JavaScript-кодом, который может быть запущен в отдельном потоке ▪ Обмен данными с вызывающим кодом – только через механизм сообщений (подписка на события) ▪ Воркер не имеет доступа к вызывающему контексту (переменные и т.п.), не имеет доступа к DOM страницы
  • 17. Есть ещѐ Node.js… Но для докладчика это Terra Incognita
  • 18. Интересное чтение ▪ Event loops in JS specification ▪ Async JavaScript: Build More Responsive Apps with Less Code by Trevor Burnham ▪ High Performance JavaScript by Nicholas C. Zakas ▪ StackOverflow – exceptions from the rule
  • 19. Вопросы? Внимательно слушаю!  Андрей Кулешов kaa-tula@ya.ru akuleshov.tula Специально для http://GetDev.NET