TypeError: Не може да се прочете свойството 'then' на undefined. Обещания?

Мисля, че имам няколко проблема с разбирането как работят обещанията. Разбирам, че всички $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