AngularJS вызывает функцию, как только я сделал массив - PullRequest
0 голосов
/ 25 июня 2018

Фон

Я создаю приложение angularJS

У меня есть объект, называемый картой.Карта содержит массив идентификаторов преобразований.

Мне нужно выбрать каждое преобразование в массиве Карт, а затем сохранить его в массив преобразований вместо массива идентификаторов преобразований.Пока что я это сделал, за исключением вызова функции в правильное время.

Я хочу вызвать функцию: 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;
                }
            });
        });
    }

Задача

Этот текущий код будет работать только после последнего последнего преобразования в массиве карты.

Он дважды вызовет 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 голосов
/ 25 июня 2018

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 .

...