我已经阅读了很多关于承诺,解决承诺和访问数据的帖子,但我似乎无法做到。关于Stack Overflow上的一些帖子刚刚引起错误,所以我不确定我到底做错了什么。
我有这样的功能:
function getJsonl() {
var deferred = $q.defer();
$http({
url: 'urlNotShownForSecurity',
dataType:"json",
method: 'GET',
data:{"requestId":"123"},
headers:{"Content-Type":"application/json","requestId":"123"},
}).success(function(data) {
deferred.resolve(data);
console.log(data)
}).error(function(error,status,headers,config) {
deferred.reject(error);
});
return Promise.resolve(deferred.promise);
}
在这里,我返回一个已解析的json promise,从而产生一个我相信的json对象。
打印到控制台我得到以下信息:
内部数据是我需要的信息,它看起来像这样:
data:Array[8]
0:Object
description:"My description paragraph"
我在控制器中尝试了返回的对象,如:
vm.result = data.data[0].description;
vm.result = data[0].description
我在视图中尝试了许多不同的方法以及访问,但我得到了2个空白的li标签,就是这样。
我希望能够访问数据,以便填充表格。因此,如果我可以使用ng重复,那将是很好的,并且能够访问,因为一些数据不仅仅用于表格。
@DanKing,按照您的实现,我在控制台中获得以下输出: 现在我回来了一个承诺对象。
答案 0 :(得分:1)
在我看来,好像你从根本上误解了承诺的本质。
$ http()是一个异步函数 - 这意味着它不会立即完成,这就是它返回一个承诺的原因。
它看起来好像你正在尝试调用$ http()然后返回结果并从你的getJson1()方法返回它, $ http()完成执行之前
你做不到。你的getJson1()方法应该只返回promise,所以你的调用方法可以链接到它 - 就像这样:
getJson1().then(function(data) {
// do some other stuff with the data
});
承诺链的全部意义在于它们不会直接执行 - 而是提供回调函数,这些函数将在以后的操作完成时在将来的某个不确定点执行。
你的getJson1()函数只需要这样做:
return $http({
url: 'urlNotShownForSecurity',
dataType:"json",
method: 'GET',
data:{"requestId":"123"},
headers:{"Content-Type":"application/json","requestId":"123"},
});
答案 1 :(得分:-1)
好的,将答案重写为一个完整的组件来显示移动部件。
$ http会返回一个承诺,因此您的原始getJsonl
来电可以简化。使用原始的$ http参数,如果您使用<json-thing>
标记,则应将API响应转储到屏幕上:
angular.module('yourModuleName')
.component('jsonThing', {
template: '<pre>{{$ctrl.thing|json}}</pre>',
controller: function ($http) {
var $ctrl = this;
getJsonl()
.then(function (response) {
console.log(response); // we have the $http result here
$ctrl.thing = response.data; // allow the template access
}, function (error) {
console.log(error); // api call failed
});
// call backend server and return a promise of incoming data
function getJsonl() {
return $http({
url: 'urlNotShownForSecurity',
dataType: 'json',
method: 'GET',
data: { requestId: '123'},
headers: { 'Content-Type': 'application/json', requestId: '123'}
});
}
}
});
答案 2 :(得分:-1)
getJsonl().then(function(data){
console.log(data);
},function(err){
console.log(err);
})
应该有效。你的$ http请求在哪里以及你对getJsonl()的调用也会有所不同。所以在实施时要仔细选择。如果您在服务中使用它,那么您将必须返回函数结果说
this.somefunction = function (){
return getJonl();
}
并在您的控制器中注入服务并执行以下操作
service.somefunction().then(function(data){
console.log(data);
},function(err){
console.log(err);
})