TypeError: Impossibile leggere la proprietà 'then' di undefined


100
loginService.islogged() 

La funzione sopra restituisce una stringa come "failed". Tuttavia, quando provo a eseguire la funzione su di esso, restituirà l'errore di

TypeError: Cannot read property 'then' of undefined

e il cursore è indicato subito dopo connectede prima .then.

Di seguito è riportata la funzione completa:

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');
});

AGGIORNARE

Ecco la islogged()funzione

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;
    });
}

Sono certo che il $checkSessionServerrisultato sarà una stringa "fallita". Niente di più.


4
Non hai un promisequi.
— Daniel A. White

ciò che deve essere chiamato per ottenere una msg- che dovrebbe restituire una promessa.
— Daniel A. White

Se l'errore riguarda undefined, in islogged()realtà non è returnun valore. La definizione di islogged()sarebbe probabilmente la fonte dei tuoi problemi.
— Jonathan Lonowski

È probabile che in alcuni casi il tuo metodo islogged non restituisca un valore. Dopodiché vedo che NON stai usando islogged come metodo asincrono, quindi probabilmente non restituirà affatto promesse.
— Andrej Kaurin

@ Jonathan Lonowski Ho appena pubblicato la funzione islogged. Spero che questo porti più informazioni.
— Ezeewei

Risposte:


133

È necessario restituire la promessa alla funzione chiamante.

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
}

4
Questo è stato effettivamente il motivo per cui la mia fabbrica non ha restituito la promessa. Mi sono dimenticato di fare return $http.post. Non appena ho aggiunto il prefisso returna $http, ha iniziato a funzionare correttamente.
— Devner

3
@ Devner grazie, avevo dimenticato di passare returnanche io .
— ESR

2

TypeError: Impossibile leggere la proprietà 'then' di undefined quando si chiama un servizio Django utilizzando AngularJS.

Se stai chiamando un servizio Python, il codice apparirà come di seguito:

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 
}

Stiamo usando MongoDB come database (so che non importa. Ma se qualcuno sta cercando con MongoDB + Python (Django) + AngularJS il risultato dovrebbe arrivare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.