我正在尝试使用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控制台:
有什么方法可以在.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正在用异步做一些我没有正确处理的东西。
答案 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
将返回一个承诺,您可以在其中附加success
和error
回调,并在这些回调中返回一个值,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;
});
});