Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/417.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AngularJS调用一个函数一次';我做了一个数组_Javascript_Arrays_Angularjs_Ngresource - Fatal编程技术网

Javascript AngularJS调用一个函数一次';我做了一个数组

Javascript AngularJS调用一个函数一次';我做了一个数组,javascript,arrays,angularjs,ngresource,Javascript,Arrays,Angularjs,Ngresource,背景 我正在制作angularJS应用程序 我有一个叫做地图的物体。该映射具有一个变换ID数组 我需要获取映射数组中的每个变换,然后将它们保存到变换数组而不是变换ID数组中。到目前为止,除了在正确的时间调用函数外,我已经完成了这项工作 我想使用完成的数组调用函数:doStuffWithTransformArray 问题 如何仅在数组填充完成时调用函数 当前代码(这仅有时有效) 问题 此当前代码仅在贴图数组中的最后一个变换最后完成时才起作用 如果数组是这样填充的:(5)[y,y,y,empty,y

背景

我正在制作angularJS应用程序

我有一个叫做地图的物体。该映射具有一个变换ID数组

我需要获取映射数组中的每个变换,然后将它们保存到变换数组而不是变换ID数组中。到目前为止,除了在正确的时间调用函数外,我已经完成了这项工作

我想使用完成的数组调用函数:
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;