背景
我正在制作一个angularJS应用
我有一个称为Map的对象。该地图具有一组Transforms ID。
我需要获取Maps数组中的每个转换,然后将它们保存到Transforms数组中,而不是Transform ID数组中。到目前为止,除了在正确的时间调用函数之外,我已经完成了此操作。
我想使用完成的数组调用函数doStuffWithTransformArray
。
问题
仅在数组填充完成后,如何调用函数?
当前代码(仅有时可用)
$scope.makeTransformArray = function () {
$scope.transforms = [];
$scope.map.transforms.forEach(function(eachTransformID, index) {
Transform.get({uuid: eachTransformID.uuid}, function(transformResult) {
$scope.transforms[index] = transformResult;
if ($scope.transforms.length == $scope.map.transforms.length) {
$scope.doStuffWithTransformArray($scope.transforms);
return;
}
});
});
}
问题
仅当Map数组中的最后一个Transform最后结束时,此当前代码才有效。
如果以如下方式填充数组,则将doStuffWithTransformArray
调用两次:(5) [y, y, y, empty, y]
第四个尚未填满,但第五个已完成。
编辑1
这是我的转换服务:
angular.module('serviceregistryApp')
.factory('Transform', function ($resource) {
var url = 'api/v1/transform/:uuid';
return $resource(url, {transform: '@transform', uuid: '@uuid'}, {
'save': {method: 'POST', headers: {"Authorization": "ABC"}},
'delete': {method: 'DELETE', headers: {"Authorization": "ABC"}},
'post': {method: 'POST', headers: {"Authorization": "ABC"}},
'get': {
method: 'GET', isArray: false,
headers: {
"Authorization": "ABC"
}, url: "api/v1/transform/:uuid",
transformResponse: function (data) {
return JSON.parse(data);
}
}
});
});
编辑2
正如评论中所建议的那样,这似乎可行,但是我觉得这很丑。
$scope.makeTransformArray = function () {
$scope.transforms = [];
var counter = 0;
$scope.map.transforms.forEach(function(eachTransformID, index) {
Transform.get({uuid: eachTransformID.uuid}, function(transformResult) {
$scope.transforms[index] = transformResult;
counter = counter + 1;
if (counter == $scope.map.transforms.length) {
$scope.doStuffWithTransformArray($scope.transforms);
return;
}
});
});
}
答案 0 :(得分:0)
NgResource实例具有一个名为$promise
的附加属性,可以从服务器到达后用于转换结果:
$scope.object = Transform.get({uuid: eachTransformID.uuid});
var promise = $scope.object.$promise;
var newPromise = promise
.then(function(object) {
var obj2 = transform(object);
$scope.object = angular.copy(obj2);
return obj2;
}).catch(function(errorResponse) {
console.log("ERROR", errorResponse.status);
throw errorResponse;
});
$scope.object.$promise = newPromise;
将诺言用于随后与$q.all的链接或合并。