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

6,167 views

Published on

Published in: Internet
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
6,167
On SlideShare
0
From Embeds
0
Number of Embeds
239
Actions
Shares
0
Downloads
7
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

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

  1. 1. ПромисыиjQuery Промисы
  2. 2. ОлегГайдаренко/markelog
  3. 3. Concurrency
  4. 4. Способы параллельного исполнениязадачТреды Процессы Fibers Coroutine etc и Promise'ы
  5. 5. JSisasingle­thread languageБраузеры имеют только один тред так же как и NodeJS
  6. 6. Ноприэтом ВNodeJS Worker'ы Чтение/запись с диска Сетевые запросы etc Браузеры Сетевые запросы Декодирование изображения Некоторые из CSS- transition'ов Web-worker'ы etc
  7. 7. ИсторияпромисовПридуманы в 1976 году Первая «имплементация» в MultiLisp'е в 1980-ых Окончательное сформирование концепции в 1988 году Первая имлементация в E в 1997 году
  8. 8. ВДжаваскриптеСначала в MochaKit – 2005 год Реализация вдохновлена фреймворком Twister (Python) Dojo – 2006 год CommonJS предложение – 2010 год Идея популязирована с имплементацией в jQuery c версии 1.5 – 2011 год
  9. 9. Предложенияв CommonJS
  10. 10. Promises/AОписана только основная концепция – пайпинг, неизмеямость стейта, поведение при появлении ошибки и метод «then» Есть так же еще несколько «спек» – B, KISS, D Основанные на той или иной библиотеки для промисов Но все они остались в тени Promise/A предложения
  11. 11. DomenicDenicola
  12. 12. Его участие в истории промисов началось с библиотеки как расширение для библиотеки юнит-тестов Первое в эту библиотеку, описывала проблему работы вместе с jQuery промисами Впоследствии эта продолжилась в jQuery баг-трекере В ней обсуждались одна деталь имплементации промисов в jQuery, которая казалось бы не была такой уж важной chai-as- promised Chai issue дискуссия
  13. 13. Сначаланиктоне слушал"Your point go from very helpful to laughably insane" "That's complete non-sense" "We do not want to do that"
  14. 14. Носовременем...Доменик становился все более и более вокальным Его участие начало проявляться во многих популярных промис- библиотек Вроде и И вот год назад поступил в клиентскую MVC- библиотеку Этот пулл имплементировал jQuery-like промисы в Ядро Эмбера Что было неприемлимо с точки зрения Доменика, это сподвигло его написать известную и во многом поворотную в истории приображения концепции Промисов Плодом которой является спека Q when.js пулл-реквест Эмбер статью Promise/A+
  15. 15. Promise/A+На ней основываются большинство существующих промис- имплементаций Описывает более детальный и ясный процесс резолвинга промиса и работу метода then Гарантированное ассинхронное исполнение и самое важное...
  16. 16. InteroperableОзначает совместимость между любой библиотекой реализовывающих спеку Это достигается точностью и четкостью формулировок спецификации: Promise/A библиотеки могли бы быть всегда ассинхронными или иногда ассинхронными then-метод мог иметь progressHandler, а могли и не иметь etc
  17. 17. ВNodeJSNodeJS становилась все более и более популярной Так же как и ассинхронная модель работы с ней становилась все более и более раздражающей Промисы же являются элигантным решением выхода из...
  18. 18. CallbackHellfirst(function(){ second(function(){ third(function(){ fourth(function(){ iDontKnowHowMuchMoreOfThisICanTake(function(){ //Fuckthis,i'mgoinghome }); }); }); }); });
  19. 19. Аспромисамиfirst().then(second).then(third).then(fourth).yeahhh(function(){ //Nowwetalking });
  20. 20. $.when(first,second,third,fourth,loveIt).then(function(){ //Thisishowwedo! });
  21. 21. DOMPromisesСо временем возникло понимание необходимости решения этой проблемы на уровне языка Это нужно было решать и нужно было решать быстро TC39-коммитет довольно медленно и обстоятельно включает новые идеи в язык Поэтому для того что бы ускорить этот процесс, стандартизация Промисов на уровне ДОМ'а После некоторых метафорфоз эта спека стала являлаться простой на репозиторий Доменика началась ссылкой
  22. 22. APIКак Promise/A+ расширяет Promise/A, так и DOM Promise'ы расширяют Promise/A+ i.e. DOM Promise спека является совместимой с Promise/A+ Предыдущие спеки не задавали то как должен быть создан Промис-объект Помимо метода then, спека декларирует достаточное API для работы с ассинхронными задачами Но при этом предоставляет минималистичное АПИ, последующие расширения же должны происходить на уровне библиотек
  23. 23. ВендорыЭтого черновика уже было достаточно для разработчиков Джаваскрипт движков В SpiderMonkey и V8 они включены как примитивы языка Браузеры же всего лишь эмитируют промисы как ДОМ API, хотя таким он не являлся При этом в Chromium'е, не смотря на то что эта спецификация является драфтом, промисы уже включены по-умолчанию Такая поспешность порадила довольно много ошибок в имплементации
  24. 24. ECMAScript6Но Промисы должны быть имлементированы на уровне языка! После того как в спеку были внесены дополнительные правки, 20- ого Января 2014 года, новая спецификация была внесена в драфт ECMAScript 6 Но для того чтобы описание Промисов было достаточно для имплементации на уровне движка, в язык пришлось внести понятие Task'ов
  25. 25. MicrotasksvsMacrotasks
  26. 26. Синхронныеи АссинхронныеI/OНапример: fs.readFileSync()иfs.readFile() $.ajax({async:false})и$.ajax()
  27. 27. Microtasksqueueprocess.nextTick, Object.observe
  28. 28. MacrotasksqueueОни же: «Task Queue» в HTML5 Или «Event Queue» в Дарте setTimeout, setInterval I/O setImmediate – особый метод, так же работает с очередью макротасков, но кладет их на самый верх FIFO стека
  29. 29. АчтожеjQuery Deferred?
  30. 30. Критика"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 по-прежнему нарушает все существующие Промис спеки И будет их нарушать!
  31. 31. TC39jQuery Foundation состоит в TC39 И могли бы заблокировать новую ECMAScript Промис спеку Но мы не хотим быть злодеями в этой истории
  32. 32. ТакчемжеjQueryимплиментация вызвалатакуюненависть? Ровно четырьмя аспектами
  33. 33. Уthenметодесть progressHandlercallback progressHandlerопционален в Promise/A, но исключен из Promise/A+
  34. 34. Плюсы/минусыПромис теперь не может иметь транзитивный стейт Ну и ладно, зато АПИ более строг и фокусирован
  35. 35. Успешные/НеудавшиесяКаллбеки могутиметьлюбоеколичество аргументов 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);
  36. 36. Плюсы/минусыСубъективно это менее удобно Если нужно передать несколько аргументов, придется хачить и передавать один объект с нужными свойствами Ну и ладно, зато промис объект теперь представляет собой результат выполнение задачи Так же это более консистентно с try...catchконструкцией
  37. 37. Негарантируетасинхронное исполнение Еще одно 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
  38. 38. Плюсы/минусыМедленее, намного медленее Но зато гарантия асинхронного выполнения помогает создавать детерминированную логику, без опасения что какой-то каллбек выполнится раньше чем должен был бы
  39. 39. ОптимизацияГодная оптимизация из Vow.js first().then(second).then(third).then(fourth)
  40. 40. Непроглатываетошибки 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" });
  41. 41. Плюсы/минусыЕсли отсутствует errorHandler, ошибка никогда не будет показана пользователю Но такая парадигма дает возможность всплывать ошибкам по цепочки промисов Тогда как в jQuery (если нет try...catchклаузы внутри then метода) ошибка будет отправлена в основной поток Но эта проблема более релевантна при дебаге, чем для продакта
  42. 42. Чтомысобираемся сэтимделать?Мы не можем изменить сигнатуру thenметода, а так же количество аргументов в каллбеках, и все из-за обратной совместимости Мы скорее всего будем гарантировать асинхронное выполнение каллбеков Мы подняли вопрос о возможности проглатывания ошибок в случае отсутствия каллбека для неудачной резолва
  43. 43. TheEnd

×