无法访问Angular Promise的属性

时间:2014-06-30 17:48:54

标签: javascript angularjs rest scope angularjs-scope

我正在尝试使用Angular编写JS函数,以便我可以让它返回一个值,然后在范围上设置一个等于该值的变量。我返回一个promise对象,根据chrome控制台有一个属性包含我的数据,但当我尝试访问它时,它说它是未定义的。

代码:

   function getData($scope, $http) { //line 71
    output = $http.get('/static/json/tickets').
        success(function(data, status) {
            output.data = data;
            console.log(output.data); //Within the proper scope; displays the data array
            output.status = status;
        }).
        error(function (data, status){
            output.data = data || "Error";
            output.status = status;
        });
        console.log(output); //displays the promise object, with attribute data
        console.log(output.data); // displays 'undefined' (out of scope?)
        return output


    out = getData($scope, $http);
    console.log(out); // Displays the promise object, with attribute data
    console.log(out.data); // displays 'undefined'
    $scope.data = out.data;

Chrome控制台:

Console.log statements

有什么方法可以在.success(data, status)函数中放置一个return语句,使父函数(getData)返回该值?我是JS的新手,虽然我知道可以从嵌套函数返回,.success$http.get返回的承诺的方法,并尝试返回output.data给出一个未定义的对象。这段代码:

function getData($scope, $http) {
dataout = {};
output = $http.get('/static/json/tickets').
    success(function(data, status) {
        dataout = data;
        console.log(output.data); //Within the proper scope; displays the data array
        output.status = status;
    }).
    error(function (data, status){
        output.data = data || "Error";
        output.status = status;
    });
    console.log(output); //displays the promise object, with attribute data
    console.log(output.data); // displays 'undefined' (out of scope?)
    return dataout

也会返回一个未定义的对象,这让我觉得Angular正在用异步做一些我没有正确处理的东西。

2 个答案:

答案 0 :(得分:2)

这不是你使用promises的方式。 output变量在数据存在之前实际记录。但是chrome控制台将对象显示为当前数据状态。

尝试记录out.data.toString()它将记录"未定义"。

试试这个:

function getData($http) {
 return $http.get('/static/json/tickets').
    success(function(data, status) {
        console.log(data); //Within the proper scope; displays the data array
        return data;
    }).
    error(function (data, status){
        return status;
    });
}

$http将返回一个承诺,您可以在其中附加successerror回调,并在这些回调中返回一个值,angular将包围一个承诺并返回它。< / p>

然后像这样称呼它:

getData($http).then(function(data){
  console.log(data);
});

可能将方法移动到服务中,并且不要将$http作为参数传递给它。

答案 1 :(得分:2)

您需要先解除承诺,然后才能获取数据。以下是使用工厂和控制器的示例:

app.factory('Tickets',function($http,$q) {
    var dataout = $q.defer();

    $http.get('/static/json/tickets/').success(function(data,status) {
            dataout.resolve(data);
    });

    return {
        getData: function() {
            return dataout.promise;
        }
    }
});

app.controller('GetData',function($scope,Tickets) {
    Tickets.getData().then(function(data) {
        $scope.out = data;
    });
});