Задать вопрос
@krekerov
Fullstack ninja

Как сделать код рабочим для promise Angular?

Есть сервис
crmServices.factory('Insurances', ['$resource',
    function ($resource) {
        return $resource('api/public/insurances/:id', {}, {
            query: {method: 'GET', isArray: true,  cache: true},
            get: {method: 'GET', isArray: false},
            save: {method: 'POST'},
            update: {method: 'PUT'},
            delete: {method: 'DELETE'}
        });
    }]);

в контроле есть код
$scope.insurances = Insurances.query()
$scope.getLen = function() {
        return = $scope.insurances.length
    }


Пока не успеет придти данные с сервиса в консоли валятся ошибки.
TypeError: Cannot read property 'length' of undefined


Представляю, что надо решить с помощью $q и promises но не выходит.
Может у кого есть готовый код?
  • Вопрос задан
  • 2242 просмотра
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 4
AMar4enko
@AMar4enko
Вы бы написали, как insurances в скопе появляются.
Может быть достаточно $scope.insurances = [];, может быть стоит получение данных вынести в resolve-секцию. Вариантов уйма, у всех свои плюсы и минусы.
Ответ написан
benbor
@benbor
Помог ответ - не забудь лайкнуть
$scope.getLen = function() {
        $scope.insurances.query().then(function(data) {
                 $scope.length = data.length
       });
}

Insurances это сервис, а не готовая коллекция (массив). У него есть только те методы, что вы передали (query, get, save ..... ) Выше изложен псевдокод, точно не помню, быть может в data будет HttpResponse а не готовый масив
Ответ написан
Комментировать
В вашем случае достаточно просто проверить промис на резолвед:
$scope.getLen = function() {
    if(!$scope.insurances.$resolved)
        return 0;
    return $scope.insurances.length;
}


В остальных случаях используйте promise.then
Ответ написан
Комментировать
miraage
@miraage
Старый прогер
Настоятельно рекомендую для таких целей использовать Restangular.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы