How can I access a variable outside a promise `.then` method?
Asked Answered
S

2

18

I'm working on a Spotify app. I'm able to login and get my token. My problem is I cannot access a variable outside the method. In this case "getCurrentUser"

This is my method:

function getUser() {
  if ($localStorage.token == undefined) {
    throw alert("Not logged in");
  } else {
    Spotify.getCurrentUser().then(function(data) {
      var names = JSON.stringify(data.data.display_name);
      console.log(names)
    })
  }
};

As you can see I console.logged the name and I do get the right value in the console. But only works there if I call the function getUser() I get undefined even with a return of the names variable.

I need to $scope that variable.

Seadon answered 29/11, 2017 at 18:55 Comment(1)
I'm guessing you have return names, but you also need return Spotify.getCurrentUser()... so that it returns the promise (and ultimately the return value from the then)Mince
M
10

getUser() is not returning anything. You need to return the promise from the Spotify.getCurrentUser(), and then when you return names within that it is returned by the outer function.

function getUser() {

    if ( $localStorage.token == undefined) {
        throw alert("Not logged in");
    }
    else {
        return Spotify.getCurrentUser().then(function(data) {
            var names = JSON.stringify(data.data.display_name);
            console.log(names)
            return names;
        })
    }
}

The above answered why you were getting undefined when calling getUser(), but if you want to work with the end result you also want to change how you're using the value you get from getUser - it returns a promise object, not the end result you're after, so your code wants to call the promise's then method when the promise gets resolved:

getUser()                        // this returns a promise...
   .then(function(names) {       // `names` is the value resolved by the promise...
      $scope.names = names;      // and you can now add it to your $scope
   });
Mince answered 29/11, 2017 at 19:1 Comment(5)
Sorry I'm new in this, It worked but I get a object that starts with $$state how do I access the data it contains?Seadon
Could you help me with that?Seadon
I added some code to handle the promise you get from getUsers() - I think that is a lot cleaner than the other answer I linked to in a comment earlier.Mince
So the function inside then will return a value that will then be returned by getUser?Villenage
@Villenage yes - getUser() returns a promise. You can access its final resolved value in the then function of that promiseMince
C
0

If you use it like that you can use the await call

function getUser() {

    if ( $localStorage.token == undefined) {
        throw alert("Not logged in");
    }
    else {
        return Spotify.getCurrentUser().then(function(data) {
            var names = JSON.stringify(data.data.display_name);
            console.log(names)
            return names;
        });
    }
}

const names = await getUser();
Cicisbeo answered 20/12, 2018 at 16:20 Comment(3)
Can we use await without adding async in function deceleration :?Muriate
No, you can't use await without async, If you will try to use you will get an error for the same.Viewfinder
@SaeedAnsari Yes, of course. await works with Promises. async simply exposes a Promise as the return value. If you already return a Promise then you can await it without asyncPolarity

© 2022 - 2024 — McMap. All rights reserved.