web-dev-qa-db-ja.com

プロミスにはjQueryまたはQ.Jsを使用します

私は BreezeJs を調べています。非同期呼び出しを処理するプロミスに Q.js を使用しているサンプルがあります。 John Papa もQを使用しています。 JQueryにもpromiseがあります 。 2つの違いは何ですか?

34
Aligned

どちらも Promises/A標準 に基づいており、thenメソッドを実装しています(現在のjQueryのみですが、以前はpipeではなく、互換性のないthenがありました)。ただし、いくつかの違いがあります。

  • Qには例外処理があります。非同期のthenコールバックでスローされたすべてのエラーがキャッチされ、Promiseが拒否されます(.end()を呼び出した場合にのみ再スローされます)。私が個人的に気に入っているかどうかはわかりません。これは、jQueryが従わない標準化された方法です jQueryの遅延でthenを拒否することは、はるかに複雑です
  • Q promiseは単一の値/理由(thenから返す/スローするなど)で解決されますが、jQueryはそのDeferredのresolve/reject呼び出しで複数の引数を許可します。
  • Qにはたくさんの プロキシメソッド があり、将来の値を変更できます
  • Qには _.all_ があり、jQuery($.when.apply($, […]))でさらに複雑になります。
  • Qはイベントループのティックを明示的に処理し、非同期性を保証しますが、jQueryも同期することができます。 Promises A/+仕様 でこれが必要になりました。

…基本的には Promises/B です。ご覧のとおり、Q APIはより強力であり、(imho)よりよく設計されています。何をしたいかによっては、Qの方が適していますが、おそらくjQuery(特に既に組み込まれている場合)で十分です。

49
Bergi

JQueryのPromises/A仕様のpromise実装には、いくつかの実際の問題があります。次のリンクはそれらを私よりもはるかによく説明しています: missing-the-point-of-promises

18
Jay Traband

ベルギの答えはかなりうまくカバーしています。ただし、追加したかったのは jQueryからのQユーザー向けのガイド です。関連セクションを要約するには:

  • Qは例外を処理するため、統一されたインターフェースを通じてすべてのエラーを処理できます。
  • Qはそのすべてのメソッドとのチェーンに焦点を当てていますが、jQueryはthen/pipeからのチェーンのみを許可します。
  • Qの約束は非同期性を保証するため、jQueryの時々同期、時々非同期の動作から生じる制御フローの危険と競合状態を回避します。
  • Qプロミスは常に単一の値で満たされるか、単一の理由で拒否されます。これは、同期関数が常に単一の値を返すか、単一の例外をスローするのと同じです。
  • Qは遅延オブジェクトとpromiseを分離しますが、jQueryは分離オプションを使用してそれらを1つのオブジェクトにマージします。
  • Qは、フルフィルメントまたはリジェクションと一緒にコンテキストオブジェクトを追跡しません。これは、同期関数に対応するものがないためです(つまり、値と、呼び出し元が実行する必要があるthisを返すことはありません)。したがって、resolveWithrejectWithはありません。
  • QはPromises/A +の用語を使用しています。主な違いは、jQueryが「解決済み」を使用する場合にQが「フルフィルド」を使用し、Qでは「解決済み」がより微妙なことを意味することです。

このガイドには、jQueryおよびQ promise APIに対応する表も含まれています。

13
Domenic