AngularJSの遅延オブジェクト

一日の良い時間!



この短い投稿では、Deferred AngularJSオブジェクトの使用についてお話したいと思います。



画像





Deferredオブジェクトのメカニズム、またはむしろアイデアはChris KovalのQライブラリから追加されました。 その本質は、関数がブロックせずに値または例外を返すことができない場合、実行結果のオブザーバーであるPromiceオブジェクトを返すことです。 結果を受信するか、または受信時にエラーが発生するとすぐに、Deferredオブジェクトはオブザーバーにこれを通知します。



多くの場合、コントローラーをロードする前に、その操作のためのデータを取得する必要があります。 データの受信といえば、データの受信には無期限の時間がかかります。 最も一般的なケースは、アプリケーションサーバーからデータを受信することです。 この問題を解決するには、アプリケーションルーティングを構成するときに、resolveパラメーターを$ routeProviderに渡す必要があります。 Resolveは、コントローラーに依存関係を伝えるオブジェクトです。 すべての依存関係が解決されると、コントローラーに配置され、その後コントローラーがさらに初期化されます。



これは例でより明確に見ることができます。

angular.module('phonecat', ['phonecatFilters', 'phonecatServices', 'phonecatDirectives']). config(['$routeProvider', function($routeProvider) { $routeProvider. when('/phones', { templateUrl: 'partials/phone-list.html', controller: PhoneListCtrl, resolve: PhoneListCtrl.resolve}). when('/phones/:phoneId', { templateUrl: 'partials/phone-detail.html', controller: PhoneDetailCtrl, resolve: PhoneDetailCtrl.resolve}). otherwise({redirectTo: '/phones'}); }]);
      
      





 function PhoneListCtrl($scope, phones) { $scope.phones = phones; $scope.orderProp = 'age'; } PhoneListCtrl.resolve = { phones: function(Phone, $q) { var deferred = $q.defer(); //     //     deferred.resolve() //    deferred.reject() Phone.query(function(successData) { deferred.resolve(successData); }, function(errorData) { deferred.reject(); }); return deferred.promise; }, delay: function($q, $defer) { var delay = $q.defer(); $defer(delay.resolve, 1000); return delay.promise; } }
      
      







上記の例では、$ q.defer()-Deferオブジェクトのインスタンスを作成します。 このオブジェクトには、値を返す-deferred.resolve(val)と、何らかの理由で失敗を返す-deferred.reject(reason)の2つのメソッドがあります。 resolveメソッドまたはrejectメソッドはコールバックメソッドで呼び出され、その呼び出しはデータが正常に受信された場合、またはエラーが発生した場合に発生します。

すべての遅延オブジェクトが完了するとすぐに、その結​​果がコントローラーに追加されます。その後、ルート変更イベントが発生し、コントローラー内のデータでさまざまなアクションを実行できます。



All Articles