Я изучаю BreezeJs, и там используются образцы Q.js для промисов для обработки асинхронных вызовов. Джон Папа также использует Q. JQuery также имеет промисы. Каковы различия между ними?
Используйте jQuery или Q.Js для промисов
Ответы (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 (особенно если он уже включен) достаточно.
Q
в основном был заменен другими, еще более мощными библиотеками промисов :-)
- person Bergi; 14.04.2015
$.when
по-прежнему ужасно работать. И да, они в значительной степени устарели в современных браузерах, которые поставляются с родными промисами ES6.
- person Bergi; 27.02.2017
Реализация обещания JQuery спецификации Promises/A имеет некоторые реальные проблемы. Следующая ссылка описывает их гораздо лучше, чем я могу: обещаний
Ответ Берги довольно хорошо освещает ситуацию. Однако я хотел бы добавить, что мы создали руководство для пользователей 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.