1. ホーム
  2. ジャバスクリプト

[解決済み】$httpレスポンスのサービス内処理

2022-04-05 22:43:53

質問

最近、私が直面している問題の詳細な説明を投稿しました。 こちら にて。を送ることができなかったので、実際の $http のリクエストで、タイムアウトを使用して非同期動作をシミュレートしています。モデルからビューへのデータバインディングは、@Gloopyの助けを借りて、正しく動作しています。

では $http の代わりに $timeout (ローカルでテスト)したところ、非同期リクエストが成功し data は私のサービスでjsonレスポンスで満たされています。しかし、私のビューは更新されません。

Plunkrを更新 こちら

解決方法は?

以下は、あなたが望むことを実現するPlunkです。 http://plnkr.co/edit/TTlbSv?p=preview

このアイデアは、プロミスとその "then" 関数を直接操作して、非同期に返されたレスポンスにアクセスすることです。

app.factory('myService', function($http) {
  var myService = {
    async: function() {
      // $http returns a promise, which has a then function, which also returns a promise
      var promise = $http.get('test.json').then(function (response) {
        // The then function here is an opportunity to modify the response
        console.log(response);
        // The return value gets picked up by the then in the controller.
        return response.data;
      });
      // Return the promise to the controller
      return promise;
    }
  };
  return myService;
});

app.controller('MainCtrl', function( myService,$scope) {
  // Call the async method and then do stuff with what is returned inside our own then function
  myService.async().then(function(d) {
    $scope.data = d;
  });
});

以下は少し複雑なバージョンで、リクエストをキャッシュして初回のみ実行するようにします ( http://plnkr.co/edit/2yH1F4IMZlMS8QsV9rHv?p=preview ):

app.factory('myService', function($http) {
  var promise;
  var myService = {
    async: function() {
      if ( !promise ) {
        // $http returns a promise, which has a then function, which also returns a promise
        promise = $http.get('test.json').then(function (response) {
          // The then function here is an opportunity to modify the response
          console.log(response);
          // The return value gets picked up by the then in the controller.
          return response.data;
        });
      }
      // Return the promise to the controller
      return promise;
    }
  };
  return myService;
});

app.controller('MainCtrl', function( myService,$scope) {
  $scope.clearData = function() {
    $scope.data = {};
  };
  $scope.getData = function() {
    // Call the async method and then do stuff with what is returned inside our own then function
    myService.async().then(function(d) {
      $scope.data = d;
    });
  };
});