Я смотрю BreezeJs, и там используются примеры Q.js для promises для обработки асинхронных вызовов. John Papa также использует Q. JQuery имеет promises, а также. Каковы различия между ними?
Используйте jQuery или Q.Js для promises
Ответ 1
Оба основаны на Promises/A и реализуют метод then
(хотя только текущий jQuery, они когда-то были несовместимый pipe
вместо then
). Однако есть несколько отличий:
- Q имеет обработку исключений. Все заброшенные ошибки в обратных вызовах async
then
будут обнаружены и отвергнуты обещание (и будут вызваны только при вызове.end()
). Не знаю, нравится ли мне это лично. Это стандартизованный способ, который jQuery не следует, отклонение отthen
в отложенных jQuery гораздо сложнее. - Q promises разрешаются с помощью единственного значения/причины (например, вы возвращаете/выбрасываете его из
then
), тогда как jQuery разрешает несколько аргументов вresolve
/reject
вызывает его отсрочки. - Q имеет множество Прокси-методы, которые позволят вам модифицировать будущие значения
- Q имеет
.all
и аналогичные, которые сложнее с jQuery ($.when.apply($, […])
). - Q явно работает с тиками в цикле событий и гарантирует асинхронность, в то время как jQuery также может быть синхронным. Это теперь требуется Promises A/+ спецификация.
... в основном Promises/B. Как вы можете видеть, API Q
более мощный и (imho) лучше разработан. В зависимости от того, что вы хотите сделать, Q
может быть лучшим выбором, но, возможно, jQuery (особенно если он уже включен).
Ответ 2
JQuery обещает, что реализация спецификации Promises/A имеет некоторые реальные проблемы. Следующая ссылка описывает их гораздо лучше, чем я могу: missing-the-point-of-promises
Ответ 3
Ответ Берги довольно хорошо охватывает вещи. Я хотел добавить, однако, что мы создали руководство для пользователей Q, поступающих из jQuery. Подводя итог соответствующим разделам:
- Q обрабатывает исключения, позволяя обрабатывать все ошибки через единый интерфейс.
- Q фокусируется на цепочке со всеми его методами, тогда как jQuery позволяет только цепочку от
then
/pipe
. - Q promises гарантируют асинхронность, что позволяет избежать угроз управления потоком и условий гонки, которые возникают в результате случайного синхронного, иногда асинхронного поведения jQuery.
- Q promises всегда выполняются с одним значением или отклоняются по одной причине, так же как синхронные функции всегда возвращают одно значение или генерируют одно исключение.
- Q обеспечивает разделение между отложенными и обещаниями, тогда как jQuery объединяет их в один объект с возможностью их разделения.
- Q не отслеживает объект контекста вместе с выполнением или отклонением, поскольку он не имеет параллели для синхронных функций (т.е. вы никогда не возвращаете значение, а также
this
, в котором должен запускаться вызывающий объект). Таким образом, нетresolveWith
илиrejectWith
. - Q использует терминологию Promises/A +; основное отличие состоит в том, что Q использует "выполненный", где jQuery использует "разрешенный", а в Q "разрешен" означает нечто более тонкое.
В руководстве также содержится таблица, параллельная API-интерфейсам jQuery и Q.