Użyj jQuery lub Q. js dla obietnic

Przyglądam się BreezeJs i są próbki za pomocą Q. JS do obsługi wywołań asynchronicznych. John Papa również używa Q. JQuery ma również. Jakie są różnice między nimi?

Author: hippietrail, 2012-11-28

3 answers

Oba są oparte na Promises / a standard i implementują metodę then (choć tylko obecne jQuery, kiedyś miały niezgodną pipe zamiast then). Istnieje jednak kilka różnic: {]}

  • Q obsługuje wyjątki. Wszystkie wyrzucone błędy w wywołaniach asynchronicznych then zostaną przechwycone i odrzucone obietnica(i zostaną ponownie rzucone tylko wtedy, gdy wywołasz .end()). Nie jestem pewien, czy mi się to podoba. Jest to standaryzowany sposób, w jaki jQuery nie podąża, odrzucanie z then w jQuery deferreds jest znacznie bardziej skomplikowane.
  • obietnice Q są rozwiązywane z pojedynczą wartością / powodem (jak zwracasz/wyrzucasz z then), podczas gdy jQuery pozwala na wiele argumentów w resolve/reject wzywa do odroczenia.
  • Q ma wiele metod Proxy które pozwolą Ci modyfikować przyszłe wartości
  • Q ma .all i podobne, które są bardziej skomplikowane z jQuery ($.when.apply($, […])).
  • Q działa jawnie z zaznacza w pętli event i gwarantuje asynchroniczność, podczas gdy jQuery może być również synchroniczne. Jest to teraz wymagane przez obietnice a / + specyfikacja .

... czyli w zasadzie obietnice/B . Jak widać, API Q jest potężniejsze i (imho) lepiej zaprojektowane. W zależności od tego, co chcesz zrobić, Q może być lepszym wyborem, ale może jQuery (zwłaszcza jeśli już jest włączone) wystarczy.

 49
Author: Bergi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:56

JQuery ' s promise implementacja obietnic / spec ma pewne realne problemy. Poniższy link opisuje je znacznie lepiej niż ja: missing-the-point-of-promises

 18
Author: Jay Traband,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-20 17:03:29

Odpowiedź Bergi obejmuje rzeczy dość dobrze. Chciałem jednak dodać, że stworzyliśmy przewodnik dla użytkowników Q pochodzący z jQuery . Aby podsumować odpowiednie sekcje:

  • Q obsługuje wyjątki, umożliwiając obsługę wszystkich błędów za pomocą jednolitego interfejsu.
  • Q skupia się na łańcuchowaniu wszystkimi metodami, podczas gdy jQuery zezwala tylko na łańcuchowanie z then/pipe.
  • Q obiecuje gwarancję asynchroniczności, unikając w ten sposób zagrożeń związanych z przepływem sterowania i wyścigu warunki wynikające z zachowania jQuery sometimes-sync, sometimes-async.
  • obietnice Q są zawsze spełniane z pojedynczą wartością lub odrzucane z jednego powodu, tak jak funkcje synchroniczne zawsze zwracają pojedynczą wartość lub rzucają pojedynczy wyjątek.
  • Q wymusza rozdzielenie pomiędzy deferred I promise, podczas gdy jQuery łączy je w jeden obiekt z opcją oddzielenia ich.
  • Q nie śledzi obiektu kontekstowego wraz z fulfillment lub odrzucenie, ponieważ nie ma równoległości dla funkcji synchronicznych (tzn. nigdy nie zwraca się wartości, jak również this, w której musi działać wywołujący). Nie ma więc resolveWith ani rejectWith.
  • Q używa terminologii Promises/A+; główną różnicą jest to, że Q używa "spełnionego", gdzie jQuery używa "resolved", a w Q "resolved" oznacza coś bardziej subtelnego.

Przewodnik zawiera również tabelę równoległą do interfejsów API jQuery i Q promise.

 13
Author: Domenic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-07 07:44:48