2015-11-24 19 views
-1

我的服務定義是這樣的:

module.factory('portfolio',function(){ 
var data; 
var selectedPort; 
return{ 
    getData: function(){ 
     return data; 
    }, 
    setData:function(portfolios){ 
     data = portfolios; 
    }, 
    getSelectedPort:function(){ 
     return selectedPort; 
    }, 
    setSelectedPort:function(portfolioDetail){ 
     selectedPort = portfolioDetail; 
    } 
} 
}); 

而在我的控制器中的代碼如下:

module.controller('portfoliosController', function($scope,$http, alertService,stockService, userDataService, portfolio){ 

var req = { 
    method: 'get', 
    url: 'www.facebook.com', 
    headers: { 
     'Authorization': userDataService.getToken() 
    } 
}; 
$http(req).then(function(reponse){ 
    $scope.portfoliosPriceList = reponse['data']; 
    portfolio.setData($scope.portfoliosPriceList); 
    console.log(portfolio.getData())//At here,I can get the portfolio's data 

}, function(){ 
    alertService.setMessge("System maintenance , please try again later"); 
    alertService.alert(); 
}); 
console.log(portfolio.getData())//At here, I cannot get the portfolio's data 
}); 

錯誤是

Error: undefined is not an object (evaluating 'message.substr') 

任何人都可以幫我解決這個問題呢?其實,我真的不明白,爲什麼我不能得到$ H之外的數據TTP

+0

其因爲$ HTTP調用處理不當的時候完成的console.log()是called.what你想用數據做? –

回答

1

,你做的$http服務是異步完成的請求,讓你傳遞給.send回調不會立即調用。

後面的代碼(console.log)在調用$http(req)後立即執行,但在響應請求時調用回調之前執行。

也許你會更好地理解與簡單的例子:

function portfoliosController() { 
 
    
 
    var data = 'Initial Data. ', 
 
     content = document.getElementById('content'); 
 

 
    // setTimeout would be your $http.send(req) 
 
    // calledLater would be your .then(function() { ... }) 
 
    setTimeout(function calledLater() { 
 
    data = 'Data coming from the server takes some time to arrive...'; 
 
    content.innerHTML = content.innerHTML + data; 
 
    }, 1000); 
 

 
    content.innerHTML = content.innerHTML + data; 
 
} 
 

 
portfoliosController();
<div id="content">

1

這是因爲JavaScript是異步的,所以代碼:將數據從服務返回前

portfolio.getData() 

也許是執行。

在這種情況下,您應該只在請求完成之後(位於$ http的.then()函數內)使用投資組合數據,或者承諾。

這裏是角承諾的文檔: https://docs.angularjs.org/api/ng/service/ $ Q

相關問題