TypeError: Невозможно прочитать свойство «тогда» неопределенного. Обещания?

Я думаю, что у меня есть несколько проблем с пониманием того, как работают обещания. Я понимаю, что $http, $q и $resource возвращают обещания. Но получить доступ к данным, которые обещают возврат, вот в чем вопрос.

Я продолжаю получать ошибку, которая не совсем имеет для меня смысл.

TypeError: Cannot read property 'then' of undefined.

Сервис

this.method = function(args){
  return $http.get(url)
    .success(function(data.somePropertyOfReturnedDataBecauseItsJSON){
      console.log('It got the data');
    });
}

Контроллер

$scope.getData = function(){
 service.method(args)
   .then(function(data){
     $someObject.someProperty = data;
   });
}

Любые советы и объяснения были бы фантастическими!

Спасибо.


person Jeremy Ripple    schedule 04.03.2015    source источник


Ответы (2)


"this.method" вызывает у меня тревогу. Что такое «это» в данном контексте?

Ваш полный сервис должен быть примерно таким:

myModule.factory('myService', function($http){
    var service = {};
    var url = 'www.foobar.com/servicepath';

    service.method = function(args){ // Where are you using these args?
      return $http.get(url)
        .success(function(data){
          console.log('It got the data');
        });
    };

    return service;
}
person HankScorpio    schedule 04.03.2015
comment
разве это не должно быть myModule.factory(...) ? - person jlowcs; 04.03.2015
comment
ngModule.service(...) принимает конструктор в качестве второго аргумента. Так что в этом случае this.method = [...] будет работать как положено. - person jlowcs; 04.03.2015
comment
@HankScorpio: Что jlowcs сказал об этом. Аргументы в этом примере не используются, просто заполнители, чтобы передать общую идею того, что я пытаюсь сделать. Почему вы возвращаете услугу? На службе? Если я вызываю службу с контроллера? Мой полный сервис примерно такой, но я вырезал остальную часть, чтобы решить важную проблему, связанную с ошибкой, которую я получаю. - person Jeremy Ripple; 04.03.2015
comment
отредактировано Изменено на заводское. Я не совсем понимаю разницу между сервисом и фабрикой в ​​angular. В любом случае, я хотел указать на это и попросить вас убедиться, что это правильный контекст. - person HankScorpio; 04.03.2015
comment
@HankScorpio: это в правильном контексте. Любые идеи о том, почему я получаю эту ошибку? Или какие-либо объяснения относительно обещаний через мой код и почему он не возвращает данные? - person Jeremy Ripple; 04.03.2015
comment
Мне кажется, что это должно работать, поэтому меня больше интересует код, который вы не опубликовали. - person HankScorpio; 04.03.2015
comment
Единственное, что я не опубликовал, это объявление моего модуля, объявление службы и внедрение зависимостей. - person Jeremy Ripple; 06.03.2015

Вам нужно вернуть обещание от службы, вы можете связать обещания, а затем использовать их следующим образом:

this.method = function(args){
  return $http.get(url)
    .success(function(data.somePropertyOfReturnedDataBecauseItsJSON){
      return some value // what you return here will be the results of then
    });
}


$scope.getData = function(){
 service.method(args)
   .then(function(data){
     data here is what you return from the promise
   });
}
person Bazinga    schedule 04.03.2015
comment
@JslsAwesome: Чем это отличается от моего исходного кода? - person Jeremy Ripple; 06.03.2015
comment
Вы ничего не возвращаете из обещания, вы только записываете консоль, поэтому у вас нет метода, потому что это не возвращает обещание, вам нужно вернуть какое-то значение. - person Bazinga; 06.03.2015