Javascript AngularJS调用一个函数一次';我做了一个数组
背景 我正在制作angularJS应用程序 我有一个叫做地图的物体。该映射具有一个变换ID数组 我需要获取映射数组中的每个变换,然后将它们保存到变换数组而不是变换ID数组中。到目前为止,除了在正确的时间调用函数外,我已经完成了这项工作 我想使用完成的数组调用函数:Javascript AngularJS调用一个函数一次';我做了一个数组,javascript,arrays,angularjs,ngresource,Javascript,Arrays,Angularjs,Ngresource,背景 我正在制作angularJS应用程序 我有一个叫做地图的物体。该映射具有一个变换ID数组 我需要获取映射数组中的每个变换,然后将它们保存到变换数组而不是变换ID数组中。到目前为止,除了在正确的时间调用函数外,我已经完成了这项工作 我想使用完成的数组调用函数:doStuffWithTransformArray 问题 如何仅在数组填充完成时调用函数 当前代码(这仅有时有效) 问题 此当前代码仅在贴图数组中的最后一个变换最后完成时才起作用 如果数组是这样填充的:(5)[y,y,y,empty,y
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;
}
});
});
}
实例具有名为$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;
使用promise进行后续链接或合并。似乎最简单的方法是在每次转换完成时增加一个计数器,然后在计数器等于预期长度时调用
doStuff
函数。作为使用AngularJS的提示,并非所有内容都需要附加到$scope$只有当您需要将某些内容直接附加到浏览器时,才应该使用范围;i、 e.单击事件和直接绑定。所有其他工作都可以在普通JavaScript函数中完成,完全不在限定事件范围内。当您试图解决一个复杂的问题时,它使事情变得更容易理解。是否可以更改Transform.get(…)
的实现?如果您能让它返回一个承诺,这里可以使用解析transformResult
wait/async来确保doStuffWithTransformArray(…)
的调用只有在完成for each循环时才会发生。@DavidMichaelHuber transform.get由Angular的内置CRUD库$resource实现。我已在编辑1中添加了该服务
$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;