Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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.