无法通过多个Restangular响应创建数组

时间:2016-07-10 07:46:46

标签: angularjs restangular

我正在使用Angular并且必须填充表格,为此我需要一个通过多次调用服务器来获取值的数组。

我有以下场景

角度控制器:

  var application={};
  var data-[];
  $scope.tableData=[];
  Restangular.all("a").getList().then(function(arr1){
     for(var i=0;i<arr1.length;i++)
     {
     application.app=arr1[i];
        Restangular.one("b",arr1[i].id).get().then(function(obj1){
         application.obj1=obj1;
        });
        Restangular.one("c",arr1[i].id).get().then(function(obj2){
         application.obj2=obj2;
        });
     data.push(application);
     application={};
       if(i==arr1.length-1){
       $scope.tableData=data;
     }
    }  

  });

现在,视图中的表显示的行等于 arr1 的长度,并且还显示了arr1中的数据,但是除了上一次迭代之外,其他Restangular调用的数据都没有附加到该数组。

Onlyi在最后一次迭代中,数组完全构成,包括arr1,obj1,obj2,其他数组索引r缺少obj1 n obj2。

这是因为Restangular响应的异步行为,但无法理解如何处理它。

注意:

(预期结果)

   data[
{
    app:{
        app_id:1,
        status:1
    },
    obj1:{
        name:"user1",
        gender:"male"
    },
    obj2:{
        telephone:"63532367",
        address:"abc"
    }
},
{
    app:{
        app_id:2,
        status:1
    },
    obj1:{
        name:"user2",
        gender:"female"
    },
    obj2:{
        telephone:"63532367",
        address:"xyz"
    }
},{
    app:{
        app_id:3,
        status:1
    },
    obj1:{
        name:"user3",
        gender:"female"
    },
    obj2:{
        telephone:"63532367",
        address:"xyz"
    }
}

 ]

(当前结果)

   data[
{
    app:{
        app_id:1,
        status:1
    }
},
{
    app:{
        app_id:2,
        status:1
    }
},
{
    app:{
        app_id:3,
        status:1
    },
    obj1:{
        name:"user3",
        gender:"female"
    },
    obj2:{

    }
}
]

1 个答案:

答案 0 :(得分:1)

Restangular是异步的(在您传递给Restangular.one()的回调之前,所有.then都已剩余。这就是使用Promises的原因。

即使可以使Restangular同步,也不应该这样做,因为这会阻止浏览器直到请求数据,这将是一个糟糕的用户体验。

你应该尝试进入Promise,因为它们看起来像是同步代码,但表现为异步。

您可以尝试这样的事情:

     var a = Restangular.all("a").getList().then(function(arr1){
          // Some modification of the backend data response
          return modifiedData; // Now this should be passed to each of those Restanngular.one() methods sequentially
     });

以上代码将返回Promise调用返回的.then,该调用可以链接为以下概念:

    (new Promise(function( resolve, reject){
       $timeout(function() {
         resolve("some");
       });
     }))
    .then(function(data) {
      return data+' data';
     })
    .then(function(data) {
       return new Promise(function(resolve, reject) {
       $timeout(function() {
          resolve(data+' !!!!!!');
       });
     });
    })
    .then(function(data) {
       // this will have 'some data !!!!!!'
         console.log(data);
     });