TypeError: невозможно прочитать свойство then of undefined

100
loginService.islogged() 

Вышеупомянутая функция возвращает строку типа «сбой». Однако, когда я пытаюсь запустить эту функцию, она вернет ошибку

TypeError: Cannot read property 'then' of undefined

и курсор указывает сразу после connectedи перед .then.

Ниже представлена ​​полная функция:

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

ОБНОВИТЬ

Вот islogged()функция

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

Я уверен, что это $checkSessionServerприведет к "неудачной" строке. Ничего более.

Ezeewei
источник
4
У тебя promiseздесь нет.
Daniel A. White
что нужно вызвать, чтобы получить msg- это должно вернуть обещание.
Daniel A. White
Если ошибка касается undefined, то на islogged()самом деле returnэто не значение. Определение islogged(), вероятно, будет источником ваших проблем.
Джонатан Лоновски
Возможно, в некоторых случаях ваш islogged-метод не возвращает значение. После этого я вижу, что вы НЕ используете islogged как асинхронный метод, поэтому он, вероятно, вообще не возвращает обещание.
Андрей Каурин
@Jonathan Lonowski Я только что опубликовал функцию islogged. Надеюсь, что это принесет больше понимания.
Ezeewei

Ответы:

133

Вам нужно вернуть свое обещание вызывающей функции.

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
источник
4
Фактически это было причиной того, что моя фабрика не вернула обещание. Я забыл сделать return $http.post. Как только я добавил префикс returnк $http, он начал работать правильно.
Devner 09
3
@Devner спасибо, я тоже забыл пройти return.
ESR
2

TypeError: не удается прочитать свойство then of undefined при вызове службы Django с использованием AngularJS.

Если вы вызываете службу Python, код будет выглядеть следующим образом:

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 
}

Мы используем MongoDB в качестве базы данных (я знаю, что это не имеет значения. Но если кто-то ищет с помощью MongoDB + Python (Django) + AngularJS, результат должен прийти.

Харис Н.П.
источник