Angular JS 1.X Access已解决的Promise Objects值

时间:2016-08-05 15:29:43

标签: angularjs arrays json object angular-promise

我已经阅读了很多关于承诺,解决承诺和访问数据的帖子,但我似乎无法做到。关于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对象。

打印到控制台我得到以下信息:

enter image description here

内部数据是我需要的信息,它看起来像这样:

data:Array[8]
  0:Object
    description:"My description paragraph"

我在控制器中尝试了返回的对象,如:

vm.result = data.data[0].description;
vm.result = data[0].description

我在视图中尝试了许多不同的方法以及访问,但我得到了2个空白的li标签,就是这样。

我希望能够访问数据,以便填充表格。因此,如果我可以使用ng重复,那将是很好的,并且能够访问,因为一些数据不仅仅用于表格。

更新

@DanKing,按照您的实现,我在控制台中获得以下输出: 现在我回来了一个承诺对象。

enter image description here

3 个答案:

答案 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);
    })