我正在使用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:{
}
}
]
答案 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);
});