ホームページ >ウェブフロントエンド >jsチュートリアル >非同期データを使用して AngularJS サービスを初期化する方法は?

非同期データを使用して AngularJS サービスを初期化する方法は?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-03 17:00:15676ブラウズ

How to Initialize AngularJS Services with Asynchronous Data?

AngularJS: 非同期データを使用したサービスの初期化

非同期データ ソースを扱う場合、最初の依存関係注入で問題が発生する可能性があります。この問題に対処するために、AngularJS は非同期操作をサービスに統合するためのいくつかのアプローチを提供しています。

1. $routeProvider.when('/path',{solve:{...}

このメソッドを使用すると、サービス内の Promise が公開され、Promise アプローチがよりクリーンになります。ルート設定内のsolveプロパティにより、次のことが保証されます。依存関係はコントローラーがインスタンス化される前に解決されること。

// Service
app.service('MyService', function($http) {
  var myData = null;
  return {
    promise: $http.get('data.json'),
    ...
  }
);

// Route Config
app.config(function($routeProvider){
  $routeProvider
    .when('/', {
      ...
      resolve: {
        MyServiceData: ['MyService', function(MyService) {
          return MyService.promise;
        }]
      }
    })
  });

// Controller
app.controller('MainCtrl', function($scope, MyService) {
  $scope.data = MyService.doStuff();
  // ...
});

2. $http を使用する。インターセプター

HTTP インターセプターを使用すると、HTTP リクエスト/レスポンス プロセスにフックし、各リクエストの前後に非同期操作を実行できます。レスポンスが利用可能になったら、これを使用してサービスを初期化できます。

// Interceptor
app.factory('MyInterceptor', function ($q, $rootScope) {
  var serviceData = null;

  return {
    response: function(response) {
      if (response.config.url === 'data.json') {
        serviceData = response.data;
        $rootScope.$broadcast('serviceDataReady', serviceData);
      }
      return response;
   }
});

// Apply interceptor
app.config(['$httpProvider', function($httpProvider) {
  $httpProvider.interceptors.push('MyInterceptor');
}]);

// Service
app.service('MyService', function($rootScope) {
  $rootScope.$on('serviceDataReady', function(event, data) {
    myData = data;
  });
  
  // ...
});

3. Promise と$q

Promise を利用して、非同期操作を表し、依存関係が利用可能になったら解決することができます。$q サービスは、Promise を作成および操作するためのメソッドを提供します。

app.service('MyService', function($http, $q) {
  var deferred = $q.defer();

  $http.get('data.json').then(function(response) {
    deferred.resolve(response);
  });

  // ...
  return {
    promise: deferred.promise,
    // ...
  };
});

を活用することで。これらのテクニックを使用すると、AngularJS の非同期データを使用してサービスを効果的に初期化し、コントローラーの前に依存関係が適切に解決されるようにすることができます。インスタンス化。

以上が非同期データを使用して AngularJS サービスを初期化する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。