SlideShare ist ein Scribd-Unternehmen logo
1 von 19
Андрей Кулешов




Асинхронный
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

Weitere ähnliche Inhalte

Was ist angesagt?

Юрий Насретдинов, Badoo
Юрий Насретдинов, BadooЮрий Насретдинов, Badoo
Юрий Насретдинов, BadooOntico
 
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. Spring7bits
 
Алексей Фомкин, Практическое применение Web Workers
Алексей Фомкин, Практическое применение Web WorkersАлексей Фомкин, Практическое применение Web Workers
Алексей Фомкин, Практическое применение Web WorkersAleksey Fomkin
 
Курс Java-2016. Занятие 09. Web
Курс Java-2016. Занятие 09. WebКурс Java-2016. Занятие 09. Web
Курс Java-2016. Занятие 09. Web7bits
 
Борис Каплуновский, Aviasales.ru
Борис Каплуновский, Aviasales.ruБорис Каплуновский, Aviasales.ru
Борис Каплуновский, Aviasales.ruOntico
 
Доменно специфичные базы данных и рассылка 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
 
Дорога к микросервисной архитектуре
Дорога к микросервисной архитектуреДорога к микросервисной архитектуре
Дорога к микросервисной архитектуреCodeFest
 

Was ist angesagt? (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
 
Дорога к микросервисной архитектуре
Дорога к микросервисной архитектуреДорога к микросервисной архитектуре
Дорога к микросервисной архитектуре
 

Andere mochten auch

PhoneGap для мобильного разработчика - глубокое погружение без ОЗК
PhoneGap для мобильного разработчика - глубокое погружение без ОЗКPhoneGap для мобильного разработчика - глубокое погружение без ОЗК
PhoneGap для мобильного разработчика - глубокое погружение без ОЗКGetDev.NET
 
Что нового в Visual Studio 2015
Что нового в Visual Studio 2015Что нового в Visual Studio 2015
Что нового в Visual Studio 2015GetDev.NET
 
Что нового в Visual Studio 2013
Что нового в Visual Studio 2013Что нового в Visual Studio 2013
Что нового в Visual Studio 2013GetDev.NET
 
ASP.NET Web API
ASP.NET Web APIASP.NET Web API
ASP.NET Web APIGetDev.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
 
Slide share payment for pro v2
Slide share payment for pro v2Slide share payment for pro v2
Slide share payment for pro v2Shivani Ramnath
 
Видео в сети
Видео в сетиВидео в сети
Видео в сетиGetDev.NET
 
Reactive Extensions
Reactive ExtensionsReactive Extensions
Reactive ExtensionsGetDev.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 2013Claire Huijnen
 
Менеджер пакетов NuGet
Менеджер пакетов NuGetМенеджер пакетов NuGet
Менеджер пакетов NuGetGetDev.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 SlideShareShivani Ramnath
 

Andere mochten auch (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
 

Ähnlich wie Async Javascript

JavaScript: хороший тон клиентской разработки
JavaScript: хороший тон клиентской разработкиJavaScript: хороший тон клиентской разработки
JavaScript: хороший тон клиентской разработкиGetDev.NET
 
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
Распределённое нагрузочное тестирование на Javaaragozin
 
Windows Azure and node js
Windows Azure and node jsWindows Azure and node js
Windows Azure and node jsAlex Tumanoff
 
JavaScript & modern scala backend
JavaScript & modern scala backendJavaScript & modern scala backend
JavaScript & modern scala backendGeeksLab Odessa
 
Сергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3CСергей Константинов — Что интересного готовит нам W3C
Сергей Константинов — Что интересного готовит нам W3CYandex
 
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 concurrencyPavel Titkov
 
Node.js введение в технологию, КПИ #ITmeetingKPI
Node.js введение в технологию, КПИ  #ITmeetingKPINode.js введение в технологию, КПИ  #ITmeetingKPI
Node.js введение в технологию, КПИ #ITmeetingKPITimur 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, один goBadoo Development
 
Управление памятью в CPython
Управление памятью в CPythonУправление памятью в CPython
Управление памятью в CPythonAnton Patrushev
 
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
 
SmartOS/Solaris app tuning tools/technologies on HL++ 2013
SmartOS/Solaris app tuning tools/technologies on HL++ 2013SmartOS/Solaris app tuning tools/technologies on HL++ 2013
SmartOS/Solaris app tuning tools/technologies on HL++ 2013Alex Chistyakov
 

Ähnlich wie 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-скриптов в облаке собственной разраб...
 
SmartOS/Solaris app tuning tools/technologies on HL++ 2013
SmartOS/Solaris app tuning tools/technologies on HL++ 2013SmartOS/Solaris app tuning tools/technologies on HL++ 2013
SmartOS/Solaris app tuning tools/technologies on HL++ 2013
 

Mehr von GetDev.NET

Гирлянда для программистов
Гирлянда для программистовГирлянда для программистов
Гирлянда для программистов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 MindstormsGetDev.NET
 
Особенности мобильной платформы Windows Phone 8
Особенности мобильной платформы Windows Phone 8Особенности мобильной платформы Windows Phone 8
Особенности мобильной платформы Windows Phone 8GetDev.NET
 
XAML - язык разметки приложений
XAML - язык разметки приложенийXAML - язык разметки приложений
XAML - язык разметки приложенийGetDev.NET
 
Dynamic Language Runtime
Dynamic Language RuntimeDynamic Language Runtime
Dynamic Language RuntimeGetDev.NET
 
Roslyn - компилятор как сервис
Roslyn - компилятор как сервисRoslyn - компилятор как сервис
Roslyn - компилятор как сервисGetDev.NET
 
ASP.NET, MVC, ASP.NET MVC
ASP.NET, MVC, ASP.NET MVCASP.NET, MVC, ASP.NET MVC
ASP.NET, MVC, ASP.NET MVCGetDev.NET
 
Обзор рекомендаций W3C
Обзор рекомендаций W3CОбзор рекомендаций W3C
Обзор рекомендаций W3CGetDev.NET
 
Первое знакомство с MODx revolution
Первое знакомство с MODx revolutionПервое знакомство с MODx revolution
Первое знакомство с MODx revolutionGetDev.NET
 
Dependency injection
Dependency injectionDependency injection
Dependency injectionGetDev.NET
 
Web deployment
Web deploymentWeb deployment
Web deploymentGetDev.NET
 
Microsoft NUI - Surface
Microsoft NUI - SurfaceMicrosoft NUI - Surface
Microsoft NUI - SurfaceGetDev.NET
 
Microsoft NUI - Kinect
Microsoft NUI - KinectMicrosoft NUI - Kinect
Microsoft NUI - KinectGetDev.NET
 

Mehr von 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