TypeError: Die Eigenschaft 'then' von undefined kann nicht gelesen werden

99
loginService.islogged() 

Die obige Funktion gibt eine Zeichenfolge wie "fehlgeschlagen" zurück. Wenn ich jedoch versuche, die Funktion auszuführen, wird der Fehler von zurückgegeben

TypeError: Cannot read property 'then' of undefined

und der Cursor wird direkt nach connectedund vor angezeigt .then.

Unten ist die volle Funktion:

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

AKTUALISIEREN

Hier ist die islogged()Funktion

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

Ich bin sicher, dass $checkSessionServerdies zu einer "fehlgeschlagenen" Zeichenfolge führen wird. Nichts mehr.

Ezeewei
quelle
4
Du hast kein promisehier.
Daniel A. White
Was, was genannt werden muss, um ein zu bekommen msg- das sollte ein Versprechen zurückgeben.
Daniel A. White
Wenn der Fehler betrifft undefined, dann islogged()ist eigentlich returnkein Wert. Die Definition von islogged()wäre wahrscheinlich die Quelle Ihrer Probleme.
Jonathan Lonowski
Es ist wahrscheinlich, dass Ihre islogged-Methode in einigen Fällen keinen Wert zurückgibt. Danach sehe ich, dass Sie islogged NICHT als asynchrone Methode verwenden, sodass es wahrscheinlich überhaupt kein Versprechen zurückgibt.
Andrej Kaurin
@ Jonathan Lonowski Ich habe gerade die islogged-Funktion gepostet. Hoffe das bringt mehr Einsicht.
Ezeewei

Antworten:

133

Sie müssen Ihr Versprechen an die aufrufende Funktion zurücksenden.

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
quelle
4
Dies war eigentlich der Grund, warum meine Fabrik das Versprechen nicht zurückgab. Ich habe es vergessen return $http.post. Sobald ich das Präfix hinzugefügt returnhabe $http, hat es richtig funktioniert.
Devner
3
@ Devner danke, ich hatte auch vergessen zu bestehen return.
ESR
2

TypeError: Beim Aufrufen eines Django-Dienstes mit AngularJS kann die Eigenschaft 'then' von undefined nicht gelesen werden.

Wenn Sie einen Python-Dienst aufrufen, sieht der Code wie folgt aus:

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 
}

Wir verwenden MongoDB als Datenbank (ich weiß, dass es keine Rolle spielt. Aber wenn jemand mit MongoDB + Python (Django) + AngularJS sucht, sollte das Ergebnis kommen.

Haris Np
quelle