AngularJS を使用して Promise を処理する場合、複数の Promise を処理する必要がある状況に遭遇することがあります。
最も簡単な解決策は、Promise ごとに then を設定することです。以下のように:
var app = angular.module("app",[]); app.controller("AppCtrl", function($q. $timeout){ var one = $q.defer(); var two = $q.defer(); var three = $q.defer(); $timeout(function(){ one.resolve("one done"); }, Math.random() * 1000) $timeout(function(){ two.resolve("two done"); }, Math.random() * 1000) $timeout(function(){ three.resolve("three done"); }, Math.random() * 1000) functioin success(data){ console.log(data); } one.promise.then(success); two.promise.then(success); three.promise.then(success); })
もっと良い方法はありますか?
$q.all メソッドは Promise の配列を受け入れることができ、次のように呼び出されます:
var all = $q.all([one.promise, two.promise, three.promise]); all.then(success);
約束とは何ですか?
Promise は、値を非同期に処理するメソッドであり、リモート オブジェクトを扱う場合、関数によってスローされる最終的な戻り値または例外を表します。 。 Promiseも非同期処理メソッドの一種だとすると、XHRや$.ajaxとの違いを考えてみますか?
JS ではクロージャまたはコールバックを使用して、ページが読み込まれた後の XHR リクエストなどの非同期に返されたデータに応答するのが一般的です。コールバック関数のトリガーに依存せずに、データが返されたかのように通常どおりデータを操作できます。
では、ng が提案した約束は、どのような問題を解決することを目的としているのでしょうか? コールバックは長い間使用されてきましたが、他のコールバックに依存するコールバックがあり、呼び出しのたびにエラーを表示する必要がある場合、通常はデバッグが非常に困難になります。違いは、Promise が別の抽象化を提供することです。これらの関数は Promise オブジェクトを返します。
Promise を使用する理由
Promise を使用する利点の 1 つは、コールバックの固定された思考ロジックから逃れられることです。 Promise は、同期関数に基づいて、非同期処理メカニズムを同期に似せて、期待どおりに戻り値と例外値をキャプチャできます。エラーはプログラム内でいつでも捕捉でき、プログラム例外に依存する後続のコードをバイパスできます。この同期の利点について考える必要はありません。したがって、Promise を使用する目的は、コードを非同期で実行する機能を維持しながら、機能の組み合わせとエラー バブリング機能を取得することです。
Promise はファーストクラスのオブジェクトであり、いくつかの規則があります。
• 解決または拒否は 1 つだけ呼び出されます。
• Promise が実行または拒否された場合でも、Promise に依存するハンドラーは引き続き呼び出されます。
• ハンドラーは常に非同期で呼び出されます。