创建数组后,AngularJS就会调用函数

时间:2018-06-25 18:02:03

标签: javascript arrays angularjs ngresource

背景

我正在制作一个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;
                }
            });
        });
    }

1 个答案:

答案 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的链接或合并。