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 трябва да правите само това 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
Защо да използвате $promise? Функцията за обратно извикване на .get не трябва ли да се извиква само когато сървърът върне данни?? И получавам тази грешка: TypeError: Cannot read property 'then' of undefined Очевидно има грешка някъде, но не мога да я разбера. Особено след като console.log(Locations.get()) показва обект. Така че защо нямам достъп до обещания ресурс? - person user48594; 07.07.2015