我正在使用角度Promise来执行依赖于从数据库中获取的数据数组的函数。
我使用决心并承诺如下所示。
function Mainctrl($q,MyService){
var defer=$q.defer();
defer.promise
//The data im receiving in promise is from the resolve "MyService.getAll({ID :ID})"
.then(function(data){
$scope.mydata=data;
$scope.mylength=$scope.mydata.length;
console.log();
});
//This code MyService.getAll({ID :ID}) returns an array from the database, i am using that result array in promise as "data"
defer.resolve(MyService.getAll({ID :ID}));
}
问题是在填充数据数组之前执行的承诺总是将长度显示为0.但我使用超时而不是承诺,填充数据数组并正确显示长度。
MyFactory方法getAll是
app.factory("MyService", function($resource, $http) {
var resource = $resource("/rest/:ID ", { ID : "@_ID " },
{
'create': { method: 'POST' },
'getAll': { method: 'GET', isArray: true },
'get': { method: 'GET', isArray: false },
'update': { method: 'PUT' },
'destroy': { method: 'DELETE' }
}
);
return resource;
});
答案 0 :(得分:4)
我不确定你做了什么,但是控制器不需要创建任何defer \ promise对象。
代码应该在
行function Mainctrl($scope,MyService){
MyService.getAll({ID :ID}).then(function(data){
$scope.mydata=data;
$scope.mylength=$scope.mydata.length;
console.log();
});
}
<强>更新强>
由于您的服务不是返回promise而是一个资源对象,因此对getAll
的调用不会返回promise,而是一个稍后会被填充的数组。
function Mainctrl($scope,MyService){
MyService.getAll({ID :ID},function(data){
$scope.mydata=data;
$scope.mylength=$scope.mydata.length;
console.log();
});
}
答案 1 :(得分:1)
根据docs.angularjs.org/api/ngResource.$resource,getAll
方法确实返回一个空数组,当数组到达时,这些数组将与值异步填充。丑陋的设计。
function Mainctrl($scope,MyService){
MyService.getAll({ID :ID}).$promise.then(function(data){
$scope.mydata = data;
$scope.mylength = data.length;
});
}