5

私の質問は非常に一般的であり、いくつかの関連する質問はSOで見つけることができますが、それらのどれも私が探しているものではありません。

私はjQueryDeferredオブジェクトを読んだり、いじったりしてきましたが、ライブラリ自体の中でajaxリクエストやアニメーションなどを処理するために多く使用されていることがわかります。一般的な機能を理解しており、状況によっては非常に役立つことが証明されていると思います。 。jQueryライブラリは、この概念を使用していくつかの問題を非常にエレガントに解決します。

ここで私の質問は次のとおりです。Deferredオブジェクトを使用してエレガントかつ堅牢に解決できる個別の問題/解決シナリオの概要を把握しておくと非常に便利だと思います。

jQuery Deferredを使用したソリューションが必要なのはどのような状況ですか?jQuery Deferred機能を使用して最もエレガントに解決できるjavascriptソフトウェア設計の一般的なパターンはどれですか?私は、すべてのOOアナリストが知っている4つのデザインパターンのギャングの精神で、(非常に具体的な例ではなく)非常に一般的なパターンのリストを作成することを目指しています。

頭の後ろにそのようなリストがあるので、jQueryソリューションを設計するとき、ブリッジ、ファクトリ、...パターンがすでに柔軟で堅牢なソリューションを設計するのに役立つのと同じように、これらの遅延パターンを利用することは第二の性質になるはずです毎回車輪の再発明をする必要はありません。

4

2 に答える 2

6

非同期タスクは、大きく5つの異なる問題ドメインに分類されます。

ネットワーク/ローカルデータリクエスト

おそらく最も一般的で、FabrizioCalderanの回答で十分にカバーされています。このような場合、粒度(リクエストのさまざまなタイプの成功またはエラー)に応じて、少なくとも2つの結果を処理し、それらに基づいて行動する必要があります。

Deferred / Promisesを使用すると、リクエストをチェーンまたは並列化するか、両方のハイブリッドを使用して、タスクに必要なリソースの読み込みを実現できます。たとえば、さまざまなリクエストが完了するのを待ってから、さらにロードしたり、それらの結果に基づいて何か他のことをしたりできます。

アニメーション

連鎖/並列アニメーションシーケンスは、実装と保守がより簡単です。さまざまな結果に基づく条件付きステップ(ユーザーの操作またはランダムな要因を考慮する場合)も、実装と保守が容易です。

(疑似)モーダルユーザーインタラクション

ブラウザでは真のモーダル操作はできません。ダイアログやウィザードなどを表示するには、表示をクリーンアップする前に、解決された結果(成功、アクティビティ、オプション、キャンセルなど)に基づいて動作するために、Deferred /Promisesによって提供される非同期操作が必要です(またすでに述べたように、簡略化され、通常の操作を再開します。延期/約束により、比較的単純な宣言型の方法でこれらの結果に基づいて行動することができます。

事実上、これはユーザーインタラクションとアニメーション/表示シーケンスを組み合わせたものです。

ハードウェアの可用性/応答

モバイルデバイスの可用性(たとえばPhoneGapを介して)は、サービスを呼び出す前に保証する必要があり、多くの場合、非同期で応答を提供します。Deferred / Promisesを使用すると、これらのデバイスの相互作用を管理するコードが簡素化および改善されます。

ソフトウェアコンポーネントのアクティビティ

特にSQLLiteは、JSリクエストへの応答を非同期的に提供するため、複雑なクエリの相互作用を行うことは、コールバックを使用する場合よりもはるかに簡単です。

理論的には、これは非同期応答を提供するすべての補助ソフトウェアコンポーネントに適用されます。

もう一つ...

これは私がDeferred/Promisesで読んだ中で最高の記事の1つです。適切な詳細な例と説明については、これを読むことをお勧めします。

tl; dr

Deferred / Promisesの大きな利点は、いくつかのドメインのソリューションを最初に考案し、後で維持するのがはるかに簡単になることです。場合によっては、コールバックと複雑な結果チェックを使用して試みられた場合、多くの完全に成長した大人(そしておそらく多くの小さな子供)がそれらを非常に単純化します

...これから行くだろう...

私たちはボートに乗っており、Deferred/Promisesを使用しています

これに...

コールバックは悪夢です

ソリューションが連鎖を必要とする場合、1つ以上のプロセスの結果が解決するのを待つ、またはこれらの任意の組み合わせが必要な場合、Deferred / Promisesはフラストレーションと苦痛を軽減し、コードを継承するすべての人に同じことを行います。

今、外に出て、恐ろしい虐待を犯して私が間違っていることを証明してください。いいえ、実際にはそうしないでください。きれいで保守しやすいコードを書いてください。

免責事項:コードでDeferred / Promisesを使用すると、「ボートに乗っている」ようには感じられない場合がありますが、コールバックで作成されたスープよりもはるかに快適です。

于 2013-02-26T19:15:47.223 に答える
4

どのような状況で、jQueryDeferredを使用したソリューションが求められます

親指のルールとして、あなたが両方を持っているたびに

  1. 1つ以上の非同期タスク
  2. それらのタスクの成功/失敗に応じたいくつかの関連するコールバック

据え置きオブジェクトとPromiseの観点からコードのリファクタリングを試みることができます。遅延オブジェクトを使用できる最も一般的なシナリオには、

  • Ajaxリクエストとコールバック(単一のリクエスト、並列または連鎖リクエスト)
  • イベントで実行するアセットとアクションの非同期読み込みload(例:このような画像プリローダー:https ://gist.github.com/958683 )
  • 多数のネストされたスコープを必要とするアニメーションまたは多数のシーケンシャルアニメーションの完了後に実行するコールバック:これは、promise()メソッドをメソッドにチェーンするだけで簡単に実現できるanimate()ため、コールバックで処理する約束を返しdone()ます(正直なところ私はアニメーションがどのように失敗するかを実際に理解することはできません)

このヒントが何らかの形で役立つことを願っています。

于 2012-08-28T14:20:29.090 に答える