ngresource получает ошибку доступа к ресурсу свойств

У меня есть простая фабрика ниже, которая запрашивает объект json с некоторой информацией о местоположении. Запросы работают, я вижу, что данные находятся в объекте. Но почему-то есть проблема с масштабом. Я не могу получить доступ к свойствам объекта местоположения, даже если знаю, что объект имеет свойство и правильный массив.

Вы можете видеть в фрагменте кода ниже (если вы посмотрите на комментарии), что я не могу получить доступ к некоторому значению объекта при попытке вывода на консоль.

Есть идеи, в чем может быть проблема?

    .factory('Spots', function(){
        return{
            all: function($resource){
                var locations;
                var Locations =  $resource('http://localhost\\:3000/locationsd/');
                locations = Locations.get(function(){
                    console.log(locations.results[0].obj.name); // THIS WORKS -> gives me the name of the location
                });
                console.log(locations); // THIS WORKS -> log an object with a result array, etc.
                console.log(locations.results[0].obj.name); // THIS DOESNT WORK -> TypeError: Cannot read property '0' of undefined
                return locations;
            }
        }
    })


person user48594    schedule 25.06.2015    source источник
comment
Вы всегда будете получать данные ответа в функции обратного вызова метода .get.   -  person Pankaj Parkar    schedule 25.06.2015
comment
Вы можете return из асинхронного метода...   -  person tymeJV    schedule 25.06.2015
comment
@PankajParkar да, я понимаю, что функция обратного вызова будет ждать, пока не будут доступны данные ответа. Но почему в этом случае возвращаемое значение не определено: locations = Locations.get(function(data){ return data;}); return locations   -  person user48594    schedule 07.07.2015
comment
@user48594 user48594 вы должны делать только это locations = Locations.get(function(data){ return data;}); не возвращать местоположение из-за пределов .get функции .. ничего не будет ..   -  person Pankaj Parkar    schedule 07.07.2015


Ответы (1)


Это связано с тем, что он асинхронный. Чтобы правильно использовать $resource внутри службы, вы должны использовать промисы.

.factory('Spots', function(){
        return{
            all: function($resource){
                var Locations =  $resource('http://localhost\\:3000/locationsd/');
                return Locations.get().$promise.then(function(res){
                    return res;
                });
            }
        }
    })

Затем при вызове функции с вашего контроллера:

Spots.all().then(function(res){ 
   //do stuff with res here 
})

Если вы не знаете, что такое обещания, прочитайте о них здесь: https://docs.angularjs.org/api/ng/service/$q

Общая идея заключается в том, что ресурс обещает, что в конце концов он завершится, и когда это будет сделано, он вызовет функцию, которую вы передаете в его then().

person Devin H.    schedule 25.06.2015
comment
Зачем использовать $обещание? Разве функция обратного вызова .get не должна вызываться только тогда, когда сервер возвращает данные?? И я получаю эту ошибку: TypeError: Cannot read property 'then' of undefined Очевидно, где-то есть ошибка, но я не могу ее понять. Тем более, что console.log(Locations.get()) показывает объект. Так почему я не могу получить доступ к обещанному ресурсу? - person user48594; 07.07.2015