TypeError: Nie można odczytać właściwości „then” wartości undefined

100
loginService.islogged() 

Powyższa funkcja zwraca ciąg znaków typu „failed”. Jednak gdy spróbuję uruchomić na nim funkcję, zwróci błąd

TypeError: Cannot read property 'then' of undefined

a kursor wskazuje tuż po connectedi przed .then.

Poniżej znajduje się pełna funkcja:

var connected=loginService.islogged();
alert(connected);
connected.then(function(msg){
    alert("connected value is "+connected);
    alert("msg.data value is "+msg.data);
    if(!msg.data.account_session || loginService.islogged()=="failed")       
        $location.path('/login');
});

AKTUALIZACJA

Oto islogged()funkcja

islogged:function(){
    var cUid=sessionService.get('uid');
    alert("in loginServce, cuid is "+cUid);
    var $checkSessionServer=$http.post('data/check_session.php?cUid='+cUid);
    $checkSessionServer.then(function(){
        alert("session check returned!");
        console.log("checkSessionServer is "+$checkSessionServer);
        return $checkSessionServer;
    });
}

Jestem pewien, że $checkSessionServerspowoduje to „nieudany” ciąg. Nic więcej.

Ezeewei
źródło
4
Nie masz promisetutaj.
Daniel A. White,
co należy nazwać, aby otrzymać msg- to powinno zwrócić obietnicę.
Daniel A. White,
Jeśli błąd dotyczy undefined, to w islogged()rzeczywistości nie returnjest wartością. Definicja islogged()prawdopodobnie byłaby źródłem twoich problemów.
Jonathan Lonowski,
Prawdopodobnie Twoja metoda islogged w niektórych przypadkach nie zwraca wartości. Po tym widzę, że NIE używasz islogged jako metody asynchronicznej, więc prawdopodobnie w ogóle nie zwraca obietnicy.
Andrej Kaurin
@Jonathan Lonowski Właśnie opublikowałem funkcję islogged. Mam nadzieję, że przyniesie to więcej wglądu.
Ezeewei

Odpowiedzi:

133

Musisz zwrócić swoją obietnicę funkcji wywołującej.

islogged:function(){
    var cUid=sessionService.get('uid');
    alert("in loginServce, cuid is "+cUid);
    var $checkSessionServer=$http.post('data/check_session.php?cUid='+cUid);
    $checkSessionServer.then(function(){
        alert("session check returned!");
        console.log("checkSessionServer is "+$checkSessionServer);
    });
    return $checkSessionServer; // <-- return your promise to the calling function
}
TheSharpieOne
źródło
4
To był właściwie powód, dla którego moja fabryka nie zwróciła obietnicy. Zapomniałem zrobić return $http.post. Jak tylko dodałem prefiks returndo $http, zaczął działać poprawnie.
Devner,
3
@Devner dziękuję, ja też zapomniałem przejść return.
ESR
2

TypeError: Nie można odczytać właściwości „then” wartości undefined podczas wywoływania usługi Django przy użyciu AngularJS.

Jeśli dzwonisz do usługi Pythona, kod będzie wyglądał jak poniżej:

this.updateTalentSupplier=function(supplierObj){
  var promise = $http({
    method: 'POST',
      url: bbConfig.BWS+'updateTalentSupplier/',
      data:supplierObj,
      withCredentials: false,
      contentType:'application/json',
      dataType:'json'
    });
    return promise; //Promise is returned 
}

Używamy MongoDB jako bazy danych (wiem, że to nie ma znaczenia. Ale jeśli ktoś szuka w MongoDB + Python (Django) + AngularJS) wynik powinien przyjść.

Haris Np
źródło