我试图在服务中存储API响应,以便我可以在我的视图中访问它。
这是我服务中的功能。它通过我的控制器访问时工作得很好,但我只想运行一次这个API调用,然后将结果存储在服务单例中。我使用https://oauth.io/docs/api-reference/client/javascript的Javascript API来访问用户信息。
getUser: function() {
var deferred = $q.defer();
var promise = authorizationResult.me().done(function(user_info) {
username = user_info.alias // username is defined outside of function
deferred.resolve(user_info);
});
return deferred.promise;
}
然后我有了存储功能:
storeUser: function() {
return username;
},
我一直在玩它,在我最近的尝试中,我试图通过另一家工厂调用getUser()方法。重要的是我想只调用一次getUser()。然后在我的控制器中,我想依靠storeUser()来访问我需要的数据。
这是我控制器中的当前getUser()调用:
twitterService.getUser().then(function(data){ // I need to change this to storeUser()
$scope.datapls(data.alias);
});
谢谢!我感谢任何和所有的帮助。
答案 0 :(得分:0)
You can use $cookiesStore of Angularjs for this. Inject $cookiesStore in your Service.
Then When u call your API For First Time Store username in cookies like this
//Add Cookie Storing Code in Your Function
getUser: function() {
var deferred = $q.defer();
var promise = authorizationResult.me().done(function(user_info) {
username = user_info.alias // username is defined outside of function
$cookies.userName=username// Storing UserName in Cookies....
deferred.resolve(user_info);
});
return deferred.promise;
}
//Change Your Storage Function Like This
storeUser: function() {
return $cookies.userName; //Return Username Stored in Cookies
},
答案 1 :(得分:0)
想出来。
我扩展了其他工厂的想法。
我用这个工厂调用getUser()函数
app.factory('InitEverything', function(twitterService, $q) {
twitterService.initialize();
var deferred = $q.defer();
var promise = twitterService.getUser().then(function(data) {
console.log("init ran");
deferred.resolve(data);
});
return deferred.promise;
});
然后我从控制器调用InitEverything,如下所示:
InitEverything.then(function(){
if (twitterService.isReady()) {
$scope.userhandle = twitterService.storeUser();
$scope.datapls($scope.userhandle);
}
});
所以看起来我需要将2个Promise链接在一起所以来自getUser()的异步调用 - > storeUser()将加载控制器。