TypeError: no se puede leer la propiedad 'luego' de indefinido

99
loginService.islogged() 

La función anterior devuelve una cadena como "fallida". Sin embargo, cuando intento ejecutar y luego funcionar en él, devolverá el error de

TypeError: Cannot read property 'then' of undefined

y el cursor se indica justo después connectedy antes .then.

A continuación se muestra la función 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');
});

ACTUALIZAR

Aquí está la islogged()función

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

Estoy seguro de que el $checkSessionServerresultado será una cadena "fallida". Nada mas.

Ezeewei
fuente
4
No tienes un promiseaquí.
Daniel A. White
lo que se necesita llamar para obtener una msg- eso debería devolver una promesa.
Daniel A. White
Si el error es relativo undefined, en islogged()realidad no es returnun valor. La definición de islogged()probablemente sería la fuente de sus problemas.
Jonathan Lonowski
Es probable que su método islogged no devuelva un valor en algún caso. Después de eso, veo que NO está utilizando islogged como método asincrónico, por lo que probablemente no devuelva la promesa en absoluto.
Andrej Kaurin
@Jonathan Lonowski Acabo de publicar la función islogged. Espero que traiga más información.
Ezeewei

Respuestas:

133

Debe devolver su promesa a la función de llamada.

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
fuente
4
En realidad, esta fue la razón por la que mi fábrica no devolvió la promesa. Olvidé hacer return $http.post. Tan pronto como he añadido el prefijo returna $http, que comenzó a trabajar correctamente.
Devner
3
@Devner gracias, me había olvidado de pasar returntambién.
ESR
2

TypeError: no se puede leer la propiedad 'luego' de undefined al llamar a un servicio Django usando AngularJS.

Si está llamando a un servicio de Python, el código se verá a continuación:

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 
}

Estamos usando MongoDB como base de datos (sé que no importa. Pero si alguien está buscando con MongoDB + Python (Django) + AngularJS, el resultado debería aparecer.

Haris Np
fuente