Angularjs - невозможно прочитать свойство «тогда» неопределенного [дубликата]

Я новичок в angularjs, и я знаю, что есть много вопросов, касающихся этой ошибки. К сожалению, я не смог найти ответ, который подходит для моей проблемы, ни в одном из них.

У меня есть фабрика со всеми функциями и контроллерами, которые их используют. в одном контроллере у меня есть функция GET, которая возвращает массив, большинство моих функций написаны почти так же, как и функции, которые написаны точно так же, как и эта, только с другими именами/url переменных, но эта ошибка возникает только с эта функция:

Контроллер:

$scope.getAllFunction = function(){
         appServicesProvider.getAll($scope.var1).then(function(res){
             $scope.var2 = res;
         })
     };

Фабрика (appServicesProvider):

   function getAll(var1){
            $http.get(restURL+var1).then(
                    function(response){
                        return [].concat(response.data.var2)
                    }
            );
        }

Как я уже сказал, есть и другие функции, которые написаны точно так же, только эта не будет работать, что усложняет мне решение. Цените любую оказанную помощь!


person Dor Golan    schedule 27.08.2017    source источник
comment
Вы не вернули свое обещание   -  person harishr    schedule 27.08.2017
comment
@harishr Не могли бы вы быть немного более конкретным?   -  person Dor Golan    schedule 27.08.2017
comment
Вы должны вернуть вызов $http, например return $http.get(restURL+var1).then(function(response){ return [].concat(response.data.var2) }); . Но в основном фабрики должны возвращать объект.   -  person Vivz    schedule 27.08.2017
comment
@Vivz Иисус, ты прав. Виноват. удаляю вопрос! Благодарю вас! :)   -  person Dor Golan    schedule 27.08.2017


Ответы (1)


Вы должны вернуть обещание

  function getAll(var1){
           return $http.get(restURL+var1).then(
                    function(response){
                        return [].concat(response.data.var2)
                    }
            );
        }


Или вы можете переписать свою фабрику, чтобы она возвращала объект, содержащий ваше разрешенное обещание, используя $q

app.factory('appServicesProvider', function() {
    return {
        getAll: function(var1) {
            var defer = $q.defer();
            $http.get(restURL + var1).then(function(response) {
                defer.resolve([].concat(response.data.var2));
            }).catch(function(response, status) {
                defer.reject(response.data.message);
            });
            return defer.promise;;
        }
    }
});
person Vivz    schedule 27.08.2017
comment
Спасибо, но я предпочитаю, чтобы все было просто :) Вы были правы в своем первом ответе, ха-ха, спасибо! - person Dor Golan; 27.08.2017
comment
Я знаю, что это сработает с первым методом. Но я предпочитаю второй способ первому. :) - person Vivz; 27.08.2017
comment
Второй ответ — это defer anti-patten, и его следует избегать. Это ненужно и склонно к ошибочной реализации. - person georgeawg; 27.08.2017
comment
@georgeawg Спасибо. Я этого не знал. :) - person Vivz; 27.08.2017