非同期タスクは、大きく5つの異なる問題ドメインに分類されます。
ネットワーク/ローカルデータリクエスト
おそらく最も一般的で、FabrizioCalderanの回答で十分にカバーされています。このような場合、粒度(リクエストのさまざまなタイプの成功またはエラー)に応じて、少なくとも2つの結果を処理し、それらに基づいて行動する必要があります。
Deferred / Promisesを使用すると、リクエストをチェーンまたは並列化するか、両方のハイブリッドを使用して、タスクに必要なリソースの読み込みを実現できます。たとえば、さまざまなリクエストが完了するのを待ってから、さらにロードしたり、それらの結果に基づいて何か他のことをしたりできます。
アニメーション
連鎖/並列アニメーションシーケンスは、実装と保守がより簡単です。さまざまな結果に基づく条件付きステップ(ユーザーの操作またはランダムな要因を考慮する場合)も、実装と保守が容易です。
(疑似)モーダルユーザーインタラクション
ブラウザでは真のモーダル操作はできません。ダイアログやウィザードなどを表示するには、表示をクリーンアップする前に、解決された結果(成功、アクティビティ、オプション、キャンセルなど)に基づいて動作するために、Deferred /Promisesによって提供される非同期操作が必要です(またすでに述べたように、簡略化され、通常の操作を再開します。延期/約束により、比較的単純な宣言型の方法でこれらの結果に基づいて行動することができます。
事実上、これはユーザーインタラクションとアニメーション/表示シーケンスを組み合わせたものです。
ハードウェアの可用性/応答
モバイルデバイスの可用性(たとえばPhoneGapを介して)は、サービスを呼び出す前に保証する必要があり、多くの場合、非同期で応答を提供します。Deferred / Promisesを使用すると、これらのデバイスの相互作用を管理するコードが簡素化および改善されます。
ソフトウェアコンポーネントのアクティビティ
特にSQLLiteは、JSリクエストへの応答を非同期的に提供するため、複雑なクエリの相互作用を行うことは、コールバックを使用する場合よりもはるかに簡単です。
理論的には、これは非同期応答を提供するすべての補助ソフトウェアコンポーネントに適用されます。
もう一つ...
これは私がDeferred/Promisesで読んだ中で最高の記事の1つです。適切な詳細な例と説明については、これを読むことをお勧めします。
tl; dr
Deferred / Promisesの大きな利点は、いくつかのドメインのソリューションを最初に考案し、後で維持するのがはるかに簡単になることです。場合によっては、コールバックと複雑な結果チェックを使用して試みられた場合、多くの完全に成長した大人(そしておそらく多くの小さな子供)がそれらを非常に単純化します
...これから行くだろう...
これに...
ソリューションが連鎖を必要とする場合、1つ以上のプロセスの結果が解決するのを待つ、またはこれらの任意の組み合わせが必要な場合、Deferred / Promisesはフラストレーションと苦痛を軽減し、コードを継承するすべての人に同じことを行います。
今、外に出て、恐ろしい虐待を犯して私が間違っていることを証明してください。いいえ、実際にはそうしないでください。きれいで保守しやすいコードを書いてください。
免責事項:コードでDeferred / Promisesを使用すると、「ボートに乗っている」ようには感じられない場合がありますが、コールバックで作成されたスープよりもはるかに快適です。