Angularjs 我设置了服务数据,但在$http完成后,我无法获取服务数据

Angularjs 我设置了服务数据,但在$http完成后,我无法获取服务数据,angularjs,Angularjs,我的服务定义如下: module.factory('portfolio',function(){ var data; var selectedPort; return{ getData: function(){ return data; }, setData:function(portfolios){ data = portfolios; }, getSelectedPort:function(){ retu

我的服务定义如下:

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')

有人能帮我解决这个问题吗?事实上,我真的不明白,为什么我不能在$http之外获取数据这是因为javascript是异步的,所以代码:

portfolio.getData()
可能在从服务返回数据之前执行

在这种情况下,您应该仅在请求完成后(在$http的.then()函数中)使用公文包的数据,或者做出承诺

以下是有关角度承诺的文档:
$q

您对
$http
服务执行的请求是异步完成的,因此不会立即调用传递给
.send
的回调

紧接着的代码(console.log)是在发出
$http(req)
调用之后,但在响应请求时调用回调之前执行的

也许你会通过一个简单的例子更好地理解:

函数portfolioController(){
变量数据='初始数据',
content=document.getElementById('content');
//setTimeout将是您的$http.send(req)
//calledLater将是您的.then(函数(){…})
setTimeout(函数calledLater(){
数据='来自服务器的数据需要一段时间才能到达…';
content.innerHTML=content.innerHTML+数据;
}, 1000);
content.innerHTML=content.innerHTML+数据;
}
PortfolioController()

这是因为调用console.log()时$http调用尚未完成。您想对数据做什么??