TypeError: impossible de lire la propriété 'then' de undefined

100
loginService.islogged() 

La fonction ci-dessus renvoie une chaîne comme "échoué". Cependant, lorsque j'essaye d'exécuter puis de fonctionner dessus, cela retournera une erreur de

TypeError: Cannot read property 'then' of undefined

et le curseur est indiqué juste après connectedet avant .then.

Voici la fonction complète:

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

METTRE À JOUR

Voici la islogged()fonction

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

Je suis certain que le $checkSessionServerrésultera en une chaîne "ratée". Rien de plus.

Ezeewei
la source
4
Vous n'avez pas promiseici.
Daniel A. White
ce qui doit être appelé pour obtenir un msg- qui devrait retourner une promesse.
Daniel A. White
Si l'erreur concerne undefined, alors islogged()n'est pas réellement returnune valeur. La définition de islogged()serait probablement la source de vos problèmes.
Jonathan Lonowski
Il est probable que votre méthode islogged ne renvoie pas de valeur dans certains cas. Après cela, je vois que vous n'utilisez PAS islogged comme méthode asynchrone, donc cela ne retourne probablement pas du tout.
Andrej Kaurin
@Jonathan Lonowski Je viens de publier la fonction islogged. J'espère que cela apportera plus de perspicacité.
Ezeewei

Réponses:

133

Vous devez renvoyer votre promesse à la fonction d'appel.

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
la source
4
C'était en fait la raison pour laquelle mon usine ne retournait pas la promesse. J'ai oublié de faire return $http.post. Dès que j'ai ajouté le préfixe returnà $http, il a commencé à fonctionner correctement.
Devner
3
@Devner merci, j'avais oublié de passer returnaussi.
ESR
2

TypeError: Impossible de lire la propriété 'then' de undefined lors de l'appel d'un service Django à l'aide d'AngularJS.

Si vous appelez un service Python, le code ressemblera à ci-dessous:

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 
}

Nous utilisons MongoDB comme base de données (je sais que cela n'a pas d'importance. Mais si quelqu'un recherche avec MongoDB + Python (Django) + AngularJS, le résultat devrait arriver.

Haris Np
la source