Я смотрю 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.