sanosuke
sanosuke

Reputation: 19

AngularJS service to variable

Is there a way to store data to a variable?

I tried:

$scope.another =
        function(){
            var new_data;
            userService.getInfo().success(function(data){
               new_data = data;
            });
            return new_data;
        };

var data = $scope.another();

but it returns 'undefined' in the console log. Thank you

EDIT

I now get an empty array for new_data .

var new_data = [];

$scope.another = 
                function(callback){
                    userService.getInfo().success(function(data){
                        paymentService.getCashierParams({ "cardNumber": data.cardNumber}).success(function(data){
                            gameService.getAllgames({ "PID":data.GetCashierParameters.PID, "limit": 6, "skinID": 1}).success(function(data) {
                                callback(data.data.GetFlashGamesResult.Data.FlashGame);
                            });
                        });
                    });
                };
          $scope.another(function(result){
                    new_data = result;
                });
                console.log(new_data);

Upvotes: 0

Views: 69

Answers (2)

geckob
geckob

Reputation: 8138

This is due to the asynchronous function that you called. Try to use callback instead. Something like this:

$scope.another =
    function(fn){
        userService.getInfo().success(function(data){
           fn(data);
        });

    };


  var data = $scope.another(function(doSomething) {
    alert(doSomething);
    return doSomething;
};

Upvotes: 0

Jackson Ray Hamilton
Jackson Ray Hamilton

Reputation: 9486

You need to think about this problem differently. Your getInfo method returns a promise. A promise's success callback is never immediately called. It may be called sometime in the future, but in the meantime your code will continue executing and the return value of $scope.another will be undefined.

Instead, place whatever logic you wish to execute within the success callback.

userService.getInfo().success(function (data) {
    // Do stuff with data.
});

If you are not used to working with asynchronous data, this may seem weird. But it is much better than the alternative, which is hanging the page for potentially many seconds while a network request, database read, etc, completes.

If you are worried about indentation, you can create separate function(s) to handle the data.

function processData(data) {
    // Process stuff...
    return data;
}

function handleData(data) {
    data = processData(data);
    console.log(data);
}

userService.getInfo().success(handleData);

Upvotes: 1

Related Questions