2014-12-02 94 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