3

I have the following Angular service:

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

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

function userService($http) {
  return { 
    getAuthenticatedUserInfo: function () {
      return $http.get("/api/v1/users/me");
    }     
  }
}

I am getting information about the current user such as Id, Name, ...

I want to use this information in my controllers but I do not want to call the API (getAuthenticatedUserInfo) everytime I need that information ... Does it make sense?

What is the best option use this information in other controllers?

1

2 Answers 2

3

Create a local variable within the service and store the user in there. Only perform the HTTP call if the local variable is undefined. To make sure you always return a promise, whether the local user is available or not, use $q's when function:

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

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

function userService($http, $q) {

    var currentUser;
  return { 
    getAuthenticatedUserInfo: function () {
        if (currentUser){
            return $q.when(currentUser);            
        } else {
            return $http.get("/api/v1/users/me").then(function(response) {
                currentUser = response.data;
                return response.data;
            });
        }

    }     
  }
}

PS never ever use global variables

Sign up to request clarification or add additional context in comments.

4 Comments

Between using this approach or saving user info in session after login which one is better?
What exactly do you mean by 'in session'? With this solution, your state will be lost if the user refreshes the page. You might want to store the user in localstorage if you want the user to be persisted accross page reloads.
Of course, you are right ... This is enough in my case. Thanks
I spotted one issue in this solution, it will perform multiple requests until the first promise returns.
2

I would use a local variable and check if it is null, otherwise you perform the GET request.

Example:

function userService($http) {

var cached = null;

return { 
     current: function () {
         var u = $http.get("/api/v1/users/me");
         cached = u;
         return u;
     },

    currentCachedUser: function () {
      if (cached == null) {
         cached = this.current();
     }
     return cached;
     }
  }
}

2 Comments

Local variable in the service? Or a global variable in angular? Can you example what you mean?
always local, never use global variables, avoid $rootscope and such bad practices.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.