2014-12-02 80 views
0

有没有办法将数据存储到变量?AngularJS服务变量

我想:

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

var data = $scope.another(); 

但它返回在控制台日志 '未定义'。谢谢

编辑

我现在得到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); 
+2

的问题是,'getInfo'是asynchronus,这是重复[如何从一个异步回调函数的返回值?(http://stackoverflow.com/q/6847697/ 359284)。 – 2014-12-02 02:54:14

+0

这是另一个异步的js问题。尝试抛出一些console.log语句并查看会发生什么 – Stephen 2014-12-02 02:54:25

+0

它将我想要存储的数据记录到变量中。 – sanosuke 2014-12-02 02:59:56

回答

1

您需要以不同的方式思考这个问题。您的getInfo方法返回一个承诺。承诺的成功回调不会立即被调用。它可能会在将来某个时候调用,但在此期间,您的代码将继续执行,返回值$scope.another将为undefined

取而代之的是,将您希望执行的任何逻辑置于成功回调中。

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

如果你不习惯与异步数据的工作,这可能看起来怪怪的。但它比替代方案要好得多,它可以在网络请求,数据库读取等完成时将页面挂起很长时间。

如果您担心缩进,您可以创建单独的函数来处理数据。

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

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

userService.getInfo().success(handleData); 
+0

我现在得到一个空数组。 – sanosuke 2014-12-02 06:46:53

+0

在你最近的编辑中,你仍然没有在你的回调中处理你的逻辑。 '$ scope.another(function(result){console.log(result);});'会工作。传递给'$ scope.another'的回调不会在'console.log(new_data);'执行之前执行。另外,因为你在第1行将'new_data'设置为一个空数组,所以你得到的是一个空数组。你甚至不需要'new_data'变量,只需要删除它。 – Jackson 2014-12-02 07:33:20

+0

我该怎么做才能在'$ scope.another'之后执行'console.log(new_data)'?我注意到'console.log'是在'$ scope.another'之前执行的。 – sanosuke 2014-12-02 08:07:30

0

这是由于您调用的异步函数。尝试使用回调代替。事情是这样的:

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

    }; 


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

我不知道如何,但我仍然收到未定义的结果。 – sanosuke 2014-12-02 06:39:52

+0

@sanosuke:你把console.log放在哪里?如果你在$ scope.another之后执行它,这是有道理的。因为异步不会等待,而是转到下一行。尝试首先声明var数据,然后调用$ scope.another。如果数据仍旧具有旧值,则意味着异步调用尚未完成。使用承诺 – geckob 2014-12-02 19:54:10