SlideShare a Scribd company logo
ПромисыиjQuery
Промисы
ОлегГайдаренко/markelog
Concurrency
Способы
параллельного
исполнениязадачТреды
Процессы
Fibers
Coroutine
etc
и
Promise'ы
JSisasingle­thread
languageБраузеры имеют только один
тред
так же как и NodeJS
Ноприэтом
ВNodeJS
Worker'ы
Чтение/запись с
диска
Сетевые запросы
etc
Браузеры
Сетевые запросы
Декодирование изображения
Некоторые из CSS-
transition'ов
Web-worker'ы
etc
ИсторияпромисовПридуманы в 1976 году
Первая «имплементация» в MultiLisp'е в 1980-ых
Окончательное сформирование концепции в 1988
году
Первая имлементация в E в 1997 году
ВДжаваскриптеСначала в MochaKit – 2005 год
Реализация вдохновлена фреймворком Twister (Python)
Dojo – 2006 год
CommonJS предложение – 2010 год
Идея популязирована с имплементацией в jQuery c версии 1.5 –
2011 год
Предложенияв
CommonJS
Promises/AОписана только основная концепция – пайпинг, неизмеямость
стейта, поведение при появлении ошибки и метод «then»
Есть так же еще несколько «спек» – B, KISS, D
Основанные на той или иной библиотеки для промисов
Но все они остались в тени Promise/A предложения
DomenicDenicola
Его участие в истории промисов началось с библиотеки
как расширение для библиотеки юнит-тестов
Первое в эту библиотеку, описывала проблему работы вместе
с jQuery промисами
Впоследствии эта продолжилась в jQuery баг-трекере
В ней обсуждались одна деталь имплементации промисов в jQuery,
которая казалось бы не была такой уж важной
chai-as-
promised Chai
issue
дискуссия
Сначаланиктоне
слушал"Your point go from very helpful to laughably
insane"
"That's complete non-sense"
"We do not want to do that"
Носовременем...Доменик становился все более и более вокальным
Его участие начало проявляться во многих популярных промис-
библиотек
Вроде и
И вот год назад поступил в клиентскую MVC-
библиотеку
Этот пулл имплементировал jQuery-like промисы в Ядро Эмбера
Что было неприемлимо с точки зрения Доменика, это сподвигло его
написать известную и во многом поворотную в истории
приображения концепции Промисов
Плодом которой является спека
Q when.js
пулл-реквест
Эмбер
статью
Promise/A+
Promise/A+На ней основываются большинство существующих промис-
имплементаций
Описывает более детальный и ясный процесс резолвинга промиса
и работу метода then
Гарантированное ассинхронное исполнение и самое важное...
InteroperableОзначает совместимость между любой библиотекой
реализовывающих спеку
Это достигается точностью и четкостью формулировок
спецификации:
Promise/A библиотеки могли бы быть всегда ассинхронными или
иногда ассинхронными
then-метод мог иметь progressHandler, а могли и не иметь
etc
ВNodeJSNodeJS становилась все более и более популярной
Так же как и ассинхронная модель работы с ней становилась все
более и более раздражающей
Промисы же являются элигантным решением выхода из...
CallbackHellfirst(function(){
second(function(){
third(function(){
fourth(function(){
iDontKnowHowMuchMoreOfThisICanTake(function(){
//Fuckthis,i'mgoinghome
});
});
});
});
});
Аспромисамиfirst().then(second).then(third).then(fourth).yeahhh(function(){
//Nowwetalking
});
$.when(first,second,third,fourth,loveIt).then(function(){
//Thisishowwedo!
});
DOMPromisesСо временем возникло понимание необходимости решения этой
проблемы на уровне языка
Это нужно было решать и нужно было решать быстро
TC39-коммитет довольно медленно и обстоятельно включает
новые идеи в язык
Поэтому для того что бы ускорить этот процесс, стандартизация
Промисов на уровне ДОМ'а
После некоторых метафорфоз эта спека стала являлаться простой
на репозиторий Доменика
началась
ссылкой
APIКак Promise/A+ расширяет Promise/A, так и DOM Promise'ы
расширяют Promise/A+
i.e. DOM Promise спека является совместимой с Promise/A+
Предыдущие спеки не задавали то как должен быть создан
Промис-объект
Помимо метода then, спека декларирует достаточное API для
работы с ассинхронными задачами
Но при этом предоставляет минималистичное АПИ, последующие
расширения же должны происходить на уровне библиотек
ВендорыЭтого черновика уже было достаточно для разработчиков
Джаваскрипт движков
В SpiderMonkey и V8 они включены как примитивы языка
Браузеры же всего лишь эмитируют промисы как ДОМ API, хотя
таким он не являлся
При этом в Chromium'е, не смотря на то что эта спецификация
является драфтом, промисы уже включены по-умолчанию
Такая поспешность порадила довольно много ошибок в
имплементации
ECMAScript6Но Промисы должны быть имлементированы на уровне языка!
После того как в спеку были внесены дополнительные правки, 20-
ого Января 2014 года, новая спецификация была внесена в драфт
ECMAScript 6
Но для того чтобы описание Промисов было достаточно для
имплементации на уровне движка, в язык пришлось внести понятие
Task'ов
MicrotasksvsMacrotasks
Синхронныеи
АссинхронныеI/OНапример:
fs.readFileSync()иfs.readFile()
$.ajax({async:false})и$.ajax()
CodeFest 2014. Гайдаренко О. — Промисы и jQuery Промисы
Microtasksqueueprocess.nextTick, Object.observe
MacrotasksqueueОни же:
«Task Queue» в HTML5
Или «Event Queue» в
Дарте
setTimeout, setInterval
I/O
setImmediate – особый метод, так же работает с очередью
макротасков, но кладет их на самый верх FIFO стека
АчтожеjQuery
Deferred?
Критика"Promise implementation in jQuery is broken"
"But just like I should be nice to retarded children, I probably should also
welcome jQuery promises" @domenic
И довольно большое количество людей в той или иной степени
переиначивающих слова Доменика
jQuery по-прежнему нарушает все существующие Промис спеки
И будет их нарушать!
TC39jQuery Foundation состоит в TC39
И могли бы заблокировать новую ECMAScript Промис
спеку
Но мы не хотим быть злодеями в этой истории
ТакчемжеjQueryимплиментация
вызвалатакуюненависть?
Ровно четырьмя аспектами
Уthenметодесть
progressHandlercallback
progressHandlerопционален в Promise/A, но исключен из
Promise/A+
Плюсы/минусыПромис теперь не может иметь транзитивный
стейт
Ну и ладно, зато АПИ более строг и фокусирован
Успешные/НеудавшиесяКаллбеки
могутиметьлюбоеколичество
аргументов
vardef=$.Deferred();
def.promise().then(function(){
console.log(arguments.length);//7
});
def.resolve(0,1,2,3,4,5,6);
vs
vardef=when.defer();
def.promise.then(function(){
console.log(arguments.length);//1
});
def.resolve(0,1,2,3,4,5,6);
Плюсы/минусыСубъективно это менее удобно
Если нужно передать несколько аргументов, придется хачить и
передавать один объект с нужными свойствами
Ну и ладно, зато промис объект теперь представляет собой
результат выполнение задачи
Так же это более консистентно с try...catchконструкцией
Негарантируетасинхронное
исполнение
Еще одно Promise/A+ нововведение
vardef=$.Deferred();
def.promise().then(function(){
console.log(1);
});
def.resolve();
console.log(2);
//12
vs
vardef=vow.defer();
def.promise().then(function(){
console.log(1);
});
def.resolve();
console.log(2);
//21
Плюсы/минусыМедленее, намного медленее
Но зато гарантия асинхронного выполнения помогает создавать
детерминированную логику, без опасения что какой-то каллбек
выполнится раньше чем должен был бы
ОптимизацияГодная оптимизация из Vow.js
first().then(second).then(third).then(fourth)
Непроглатываетошибки
vardef=$.Deferred();
def.promise().then(function(){
throw"Error"
}).fail(function(error){
//Willnotbecalled,
//insteaderrorwillpropagatetothemainflow
console.log(error);
});
vs
vardef=Q.defer();
def.promise.then(function(){
throw"Error";
}).catch(function(error){
console.log(error);//"Error"
});
Плюсы/минусыЕсли отсутствует errorHandler, ошибка никогда не будет
показана пользователю
Но такая парадигма дает возможность всплывать ошибкам по
цепочки промисов
Тогда как в jQuery (если нет try...catchклаузы внутри then
метода) ошибка будет отправлена в основной поток
Но эта проблема более релевантна при дебаге, чем для продакта
Чтомысобираемся
сэтимделать?Мы не можем изменить сигнатуру thenметода, а так же
количество аргументов в каллбеках, и все из-за обратной
совместимости
Мы скорее всего будем гарантировать асинхронное выполнение
каллбеков
Мы подняли вопрос о возможности проглатывания ошибок в случае
отсутствия каллбека для неудачной резолва
TheEnd

More Related Content

PPTX
Basics of assertions in automated testing
PPTX
JavaScript: хороший тон клиентской разработки
PPTX
UI Automation Patterns: "Sleep" Pattern
PPTX
How to Calculate Test Automation ROI
PDF
Kranonit s16 (python). sergey burma
PDF
PPTX
How to Put Automation Engineers Down
PDF
Pros and Cons of Being an Automation Specialist
Basics of assertions in automated testing
JavaScript: хороший тон клиентской разработки
UI Automation Patterns: "Sleep" Pattern
How to Calculate Test Automation ROI
Kranonit s16 (python). sergey burma
How to Put Automation Engineers Down
Pros and Cons of Being an Automation Specialist

What's hot (20)

PDF
Демонизированный PHP - before it was cool
PPTX
разработка бизнес приложений (8)
PPTX
Tao and Test Automation
PDF
Шишки, набитые за 15 лет использования акторов в C++
ODP
Java: вчера, сегодня, завтра
PDF
Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру
PPTX
Java Core. Lecture# 3. Part# 3. Multithreading.
PDF
#noBackend, или Как выжить в эпоху толстеющих клиентов
PPTX
Amusing Geometry in Test Automation
ODP
Refactoring
PPTX
Хитрости мультипоточности
PDF
kranonit S15 Vladimir Melnik - Ruby on Rails, BDD
PDF
Actors for fun and profit
PDF
Android: Как написать приложение, которое не тормозит
PDF
Database First! О распространённых ошибках использования РСУБД
PDF
Mambility. Cтрах и ненависть к фрагментам
PDF
Антон Потапов — С++ контейнеры и многопоточность: вместе или врозь?
PDF
Scala performance под капотом
PDF
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6
PPTX
How to write good autotests
Демонизированный PHP - before it was cool
разработка бизнес приложений (8)
Tao and Test Automation
Шишки, набитые за 15 лет использования акторов в C++
Java: вчера, сегодня, завтра
Денис Кормалев — Qt. Как выжить на минном поле. Советы сапёру
Java Core. Lecture# 3. Part# 3. Multithreading.
#noBackend, или Как выжить в эпоху толстеющих клиентов
Amusing Geometry in Test Automation
Refactoring
Хитрости мультипоточности
kranonit S15 Vladimir Melnik - Ruby on Rails, BDD
Actors for fun and profit
Android: Как написать приложение, которое не тормозит
Database First! О распространённых ошибках использования РСУБД
Mambility. Cтрах и ненависть к фрагментам
Антон Потапов — С++ контейнеры и многопоточность: вместе или врозь?
Scala performance под капотом
#RuPostges в Yandex, эпизод 3. Что же нового в PostgreSQL 9.6
How to write good autotests
Ad

Viewers also liked (20)

PPTX
jQuery. Введение и практика
PPT
Презентация jQuery
PDF
DOM & jQuery
PPT
DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art)
PDF
Павел Мочалкин, Закрытие CodeFest 2015
PDF
Grail: шаги для ваших Python-тестов
PPT
Приемы, затрудняющие обнаружение и анализ вредоносного кода в PHP скриптах
PDF
Мультиплатформенная синхронизация структурированных данных
PDF
Design by Contracts in PHP
PDF
Thomas Lobinger
PDF
CodeFest 2014. Axel Rauschmayer — JavaScript’s variables: scopes, environment...
PDF
Социальный граф Одноклассников в Target Mail.Ru
PDF
Функциональное программирование в браузере
PPTX
Денис Иванов
PPT
Настройка Apache и PHP
PDF
CodeFest 2014. Лысковский А. — Семь тезисов о карьере менеджера
PDF
Здравый смысл, брендинг, веб и как всё это связано
PPTX
Maurice de Beijer
PPTX
Антон Турецкий
PDF
Management: Как сделать «Маркет» своими руками (с кино, вино и домино)
jQuery. Введение и практика
Презентация jQuery
DOM & jQuery
DUMP-2012 - Только хардкор! - "Расширяем PHP" Сергей Горшков (index.art)
Павел Мочалкин, Закрытие CodeFest 2015
Grail: шаги для ваших Python-тестов
Приемы, затрудняющие обнаружение и анализ вредоносного кода в PHP скриптах
Мультиплатформенная синхронизация структурированных данных
Design by Contracts in PHP
Thomas Lobinger
CodeFest 2014. Axel Rauschmayer — JavaScript’s variables: scopes, environment...
Социальный граф Одноклассников в Target Mail.Ru
Функциональное программирование в браузере
Денис Иванов
Настройка Apache и PHP
CodeFest 2014. Лысковский А. — Семь тезисов о карьере менеджера
Здравый смысл, брендинг, веб и как всё это связано
Maurice de Beijer
Антон Турецкий
Management: Как сделать «Маркет» своими руками (с кино, вино и домино)
Ad

Similar to CodeFest 2014. Гайдаренко О. — Промисы и jQuery Промисы (20)

PDF
Сергей Константинов — Что интересного готовит нам W3C
PDF
Выявление неполадок в Java приложениях
PDF
PDF
Viacheslav Eremin about DOT NET (rus lang)
PDF
Баба-Яга против! — Роман Дворнов, Ostrovok.ru
PDF
Баба Яга против!
PDF
Opensource на .NET
PPTX
Windows Azure and node js
PPTX
Метапрограммирование с примерами на JavaScript
PPT
запахи кода
PDF
Жизнь в изоляции / Роман Дворнов (Avito)
PPTX
Какой фреймворк нам нужен для Web? Денис Цыплаков
PPTX
разработка бизнес приложений (7)
PDF
Архитектура в Agile: слабая связность
PPTX
Dz Java Hi Load 0.4
PPTX
Aspect Oriented Programming and Design Patterns
PPTX
AOP and Design Patterns (GoF)
PPT
Client Side Autotesting Flash
PDF
Систематизация экспрешнов в IE
PPT
Практическое создание крупного масштабируемого web 2.0 c нуля (Дмитрий Бородин)
Сергей Константинов — Что интересного готовит нам W3C
Выявление неполадок в Java приложениях
Viacheslav Eremin about DOT NET (rus lang)
Баба-Яга против! — Роман Дворнов, Ostrovok.ru
Баба Яга против!
Opensource на .NET
Windows Azure and node js
Метапрограммирование с примерами на JavaScript
запахи кода
Жизнь в изоляции / Роман Дворнов (Avito)
Какой фреймворк нам нужен для Web? Денис Цыплаков
разработка бизнес приложений (7)
Архитектура в Agile: слабая связность
Dz Java Hi Load 0.4
Aspect Oriented Programming and Design Patterns
AOP and Design Patterns (GoF)
Client Side Autotesting Flash
Систематизация экспрешнов в IE
Практическое создание крупного масштабируемого web 2.0 c нуля (Дмитрий Бородин)

More from CodeFest (20)

PDF
Alexander Graebe
PDF
Никита Прокопов
PPTX
Денис Баталов
PDF
Елена Гальцина
PDF
Александр Калашников
PDF
Ирина Иванова
PDF
Marko Berković
PDF
Денис Кортунов
PDF
Александр Зимин
PDF
Сергей Крапивенский
PDF
Сергей Игнатов
PDF
Николай Крапивный
PDF
Alexander Graebe
PDF
Вадим Смирнов
PDF
Константин Осипов
PDF
Raffaele Rialdi
PDF
Максим Пугачев
PDF
Rene Groeschke
PDF
Иван Бондаренко
PDF
Mete Atamel
Alexander Graebe
Никита Прокопов
Денис Баталов
Елена Гальцина
Александр Калашников
Ирина Иванова
Marko Berković
Денис Кортунов
Александр Зимин
Сергей Крапивенский
Сергей Игнатов
Николай Крапивный
Alexander Graebe
Вадим Смирнов
Константин Осипов
Raffaele Rialdi
Максим Пугачев
Rene Groeschke
Иван Бондаренко
Mete Atamel

CodeFest 2014. Гайдаренко О. — Промисы и jQuery Промисы