Используйте jQuery или Q.Js для промисов

Я изучаю BreezeJs, и там используются образцы Q.js для промисов для обработки асинхронных вызовов. Джон Папа также использует Q. JQuery также имеет промисы. Каковы различия между ними?


person AlignedDev    schedule 28.11.2012    source источник
comment
Только мои 0,02 доллара. Я работаю над breezejs и изучил как jQuery, так и Q, прежде чем выбрать Q для реализации нашего промиса. В то время я пытался понять, что используют другие авторы библиотек и почему. Я пришел к выводу, что Q был выбран подавляющим большинством, отчасти потому, что это была независимая библиотека без веса jQuery, но также и потому, что существовал ряд тонких, но раздражающих различий между реализацией jQuery и реализацией Q, где реализация jQuery не была строго Совместимость с Promises/A или Promises/B.   -  person Jay Traband    schedule 29.11.2012
comment
В качестве примечания: с тех пор я заметил, что Google создал встроенную версию Q для использования в angularjs.   -  person Jay Traband    schedule 29.11.2012
comment
Большая разница, которая побудила меня использовать Q в некоторых случаях, заключается в том, что когда мне просто нужны промисы, Q прекрасно подходит, а jQuery — это гораздо больше. Таким образом, Q легковесен, когда все, что вам нужно, это обещания. Но когда я также использую jQuery, что бывает часто, я использую промисы jQuery, поскольку они уже есть в моем распоряжении. Словом, оба хороши :)   -  person John Papa    schedule 29.11.2012
comment
Я не рекомендую ни Q, ни jQuery, если вам нужна хорошая производительность, загляните на github.com/petkaantonov/bluebird можно увидеть здесь тест: github.com/petkaantonov/bluebird /blob/master/benchmark/stats/   -  person timaschew    schedule 10.05.2014


Ответы (3)


Оба основаны на стандарте Promises/A и реализуют метод then (хотя только текущий jQuery, у них когда-то был несовместимый pipe вместо then). Однако есть несколько отличий:

  • Q имеет обработку исключений. Все выброшенные ошибки в асинхронных обратных вызовах then будут перехвачены и отклонят промис (и будут выброшены повторно, только если вы вызовете .end()). Не уверен, что лично мне это нравится. Это стандартизированный способ, которому jQuery не следует, отказ от then в отложенных jQuery намного сложнее.
  • Промисы Q разрешаются с одним значением/причиной (например, вы возвращаете/выбрасываете его из then), в то время как jQuery допускает несколько аргументов в resolve/reject вызовах своих отложенных.
  • В Q есть множество прокси-методов, которые позволят вам изменять будущие значения.
  • Q имеет .all и подобные, которые сложнее с jQuery ($.when.apply($, […])).
  • Q явно работает с тиками в цикле событий и гарантирует асинхронность, в то время как jQuery также может быть синхронным. Теперь это требуется по спецификации Promises A/+.

… что по сути является Promises/B. Как видите, Q API более мощный и (имхо) лучше спроектирован. В зависимости от того, что вы хотите сделать, Q может быть лучшим выбором, но, возможно, jQuery (особенно если он уже включен) достаточно.

person Bergi    schedule 28.11.2012
comment
Обработка исключений — это то, что меня тоже отталкивает от Q. На мой взгляд, исключения следует использовать только для неожиданных вещей, а не для обычных ошибок. Обработка исключений слишком тяжелая, на несколько порядков медленнее, чем передача кодов ошибок и т. д. - person hippietrail; 12.02.2013
comment
jQuery не реализует Promises/A: domenic.me/2012/10/14/youre-missing-the-point-of-promises - person Domenic; 24.05.2013
comment
@Domenic: Спасибо за исправление, пришло время обновить пост. Я имел в виду, что jQuery основан на Promises/A — я знаю, что у него есть серьезные проблемы. - person Bergi; 24.05.2013
comment
Этому ответу два года+, с тех пор ничего не изменилось? - person Vadorequest; 14.04.2015
comment
@Vadorequest: Не совсем так. В jQuery есть запрос на извлечение, чтобы сделать его совместимым с A+, но, на самом деле, они еще не приняты - все еще есть несколько проблем. Единственное, что изменилось за последние годы, это то, что Q в основном был заменен другими, еще более мощными библиотеками промисов :-) - person Bergi; 14.04.2015
comment
@ Берги: Спасибо. Я посмотрю на это. - person user5670895; 27.01.2016
comment
Все ли по-прежнему верно с текущими версиями в 2017 году? Или тема устарела из-за других технологий? - person robsch; 27.02.2017
comment
@robsch Хотя jQuery 3 принял Promises / A + (обработка ошибок), $.when по-прежнему ужасно работать. И да, они в значительной степени устарели в современных браузерах, которые поставляются с родными промисами ES6. - person Bergi; 27.02.2017

Реализация обещания JQuery спецификации Promises/A имеет некоторые реальные проблемы. Следующая ссылка описывает их гораздо лучше, чем я могу: обещаний

person Jay Traband    schedule 20.03.2013
comment
+1 за ссылку на статью. Я читал эту статью раньше. Наконец-то укрепил мое понимание промисов и того, что отличалось от спецификации JQuery. - person mikekidder; 03.04.2013
comment
Эта статья великолепна, но требует нескольких прочтений. Я действительно пропустил пункт обещаний точно. Часть обработки исключений. - person Martin Hansen; 13.03.2014

Ответ Берги довольно хорошо освещает ситуацию. Однако я хотел бы добавить, что мы создали руководство для пользователей Q, перешедших из jQuery. Подводя итог соответствующим разделам:

  • Q обрабатывает исключения, позволяя обрабатывать все ошибки через единый интерфейс.
  • Q фокусируется на цепочке со всеми своими методами, тогда как jQuery допускает цепочку только из then/pipe.
  • Обещания Q гарантируют асинхронность, что позволяет избежать опасностей потока управления и условий гонки, возникающих в результате иногда синхронного, иногда асинхронного поведения jQuery.
  • Обещания Q всегда выполняются с одним значением или отклоняются по одной причине, точно так же, как синхронные функции всегда либо возвращают одно значение, либо выдают одно исключение.
  • Q обеспечивает разделение между deferred и promise, тогда как jQuery объединяет их в один объект с возможностью их разделения.
  • Q не отслеживает объект контекста вместе с выполнением или отклонением, так как это не имеет параллели для синхронных функций (т. е. вы никогда не возвращаете значение, а также this, в котором должен работать вызывающий объект). Так что нет ни resolveWith, ни rejectWith.
  • Q использует терминологию Promises/A+; основное отличие состоит в том, что Q использует «выполнено», а jQuery использует «разрешено», а в Q «разрешено» означает нечто более тонкое.

Руководство также содержит таблицу, в которой параллельно используются API-интерфейсы jQuery и Q promise.

person Domenic    schedule 07.10.2013