2016-04-17 8 views
0

以下のシナリオがあります。特定のURLのデータが必要です。このデータを、コントローラのどこでも呼び出せる変数に保存する必要があります。こうした問題を克服するために、私は以下のようなサービスを書かれています:

app.service("userData", function ($http, $q) { 

var deferred = $q.defer(); 

this.getUsers = function() { 
    return $http.get('/users') 
     .then(function (response) { 
      deferred.resolve(response.data); 
      return deferred.promise; 
     }, function (response) { 
      deferred.reject(response); 
      return deferred.promise; 
     }) 
    ; 
}; 
}); 

をそして、私のコントローラは、次のようになります。

app.controller('UserCtrl', function($scope, $q, userData) { 
    var myData = userData.getUsers() 
    .then(
     function (result) { 
      $scope.users = result; 
     }, 
     function (error) { 
      console.log(error.statusText); 
     } 
); 
    console.log(myData) 
    }); 

それは出力します。

print screen

それでは、どのように私ができますコントローラ全体にアクセス可能な変数にデータを格納しますか?あなたがキャッシュされたデータを取得するために、その後userService.getUserInfo()いつでも呼び出すことができます

angular.module("app").factory("userService", userService); 

    userService.$inject = ["$http", "$q"]; 

function userService($http, $q) { 
    var deferred = $q.defer(); 
    var promise = null; 
    var currentUser = null; 
    return { 
     getUserInfo: function() { 
      if (promise) { 
       deferred.resolve(currentUser); 
       return (currentUser) ? deferred.promise : promise; 
      } 
      else { 
       promise = $http.get("http://swapi.co/api/people/1/").then(function (response) { 
        return currentUser = response.data.name; 
       }); 
       return promise; 
      }  
     } 
    } 
} 

: おかげで..

+0

**は非同期**の素晴らしい世界へようこそ役に立てば幸い!あなたはそれをすることはできません。 http://blog.slaks.net/2015-01-04/async-method-patterns/ – SLaks

+0

'$ http.get'はすでに約束を返しています。あなたの「延期」は全く役に立たない。 – SLaks

答えて

1

私はあなたにそのようなことを示唆しています。

.config(['$routeProvider', function ($routeProvider) { 
     $routeProvider.when('/view1', { 
      templateUrl: 'view1/view1.html', 
      controller: 'View1Ctrl', 
      controllerAs: 'vc' 
     }); 
    }]) 

    .controller('View1Ctrl', function (userService) { 
      var vm = this; 
      userService.getUserInfo().then(function (result) { 
       vm.name = result 
      }, function (err) { 
       vm.name = err 
      }); 
     }); 

私はそれをテストするためにgitリポジトリを作成します。https://github.com/leader80/angular-cache-service

私はそれが

+0

実際、それも間違っている。要求が完了する前にそれを呼び出すと、2つの要求が送信されます。約束をキャッシュする必要があります。 – SLaks

+0

私はそれを間違って書いた、私はuserService.getAuthenticatedを呼び出すことを意味し、それは約束を返す。 (私の文に感謝した) – thegio

+0

いいえ;それでも複数のリクエストを発行できます。 – SLaks

関連する問題