TypeError: Não é possível ler a propriedade 'então' de indefinido

100
loginService.islogged() 

A função acima retorna uma string como "falhou". No entanto, quando tento executar uma função nele, ele retornará um erro de

TypeError: Cannot read property 'then' of undefined

e o cursor é indicado logo depois connectede antes .then.

Abaixo está a função 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');
});

ATUALIZAR

Aqui está a islogged()função

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

Tenho certeza de que o $checkSessionServerresultado será uma string "falhada". Nada mais.

Ezeewei
fonte
4
Você não tem um promiseaqui.
Daniel A. White
o que precisa ser chamado para obter uma msg- isso deve retornar uma promessa.
Daniel A. White
Se o erro for relativo undefined, islogged()não é realmente returnum valor. A definição de islogged()provavelmente seria a origem de seus problemas.
Jonathan Lonowski
É provável que seu método islogged não retorne um valor em alguns casos. Depois disso, vejo que você NÃO está usando islogged como um método assíncrono, então provavelmente não retornará nada promissor.
Andrej Kaurin
@Jonathan Lonowski Acabei de postar a função islogged. Espero que isso traga mais informações.
Ezeewei

Respostas:

133

Você precisa retornar sua promessa à função de chamada.

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
fonte
4
Esse era realmente o motivo pelo qual minha fábrica não estava retornando a promessa. I esqueceu de fazer return $http.post. Assim que adicionei o prefixo returna $http, ele começou a funcionar corretamente.
Devner,
3
@Devner obrigado, eu tinha esquecido de passar returntambém.
ESR
2

TypeError: Não é possível ler a propriedade 'then' de undefined ao chamar um serviço Django usando AngularJS.

Se você estiver chamando um serviço Python, o código ficará assim:

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 banco de dados (eu sei que não importa. Mas se alguém estiver pesquisando com MongoDB + Python (Django) + AngularJS, o resultado deve vir.

Haris Np
fonte