【问题标题】:TypeError: Cannot read property 'then' of undefinedTypeError:无法读取未定义的属性“then”
【发布时间】:2014-09-07 10:01:20
【问题描述】:
loginService.islogged() 

上面的函数返回一个类似“失败”的字符串。 但是,当我尝试对其运行 then 函数时,它会返回错误

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 将导致“失败”字符串。仅此而已。

【问题讨论】:

  • 你这里没有promise
  • 需要调用什么来获得msg - 这应该返回一个承诺。
  • 如果错误是关于undefined,那么islogged() 实际上并不是return 一个值。 islogged() 的定义可能是您问题的根源。
  • 在某些情况下,您的 islogged 方法可能没有返回值。之后我看到你没有使用 islogged 作为异步方法,所以它可能根本没有返回承诺。
  • @Jonathan Lonowski 我刚刚发布了 islogged 函数。希望能带来更多见解。

标签: javascript angularjs promise


【解决方案1】:

返回函数内部的promise值

return new Promise((done, err) => {
        ......
})

【讨论】:

    【解决方案2】:

    你需要将你的承诺返回给调用函数。

    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
    }
    

    【讨论】:

    • 这实际上是我的工厂没有兑现承诺的原因。我忘了做return $http.post。一旦我将前缀return 添加到$http,它就开始正常工作了。
    • @Devner 谢谢,我也忘了传递return
    【解决方案3】:

    TypeError: 使用 AngularJS 调用 Django 服务时无法读取未定义的属性“then”。

    如果您正在调用 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 搜索,结果应该会出来。

    【讨论】:

      猜你喜欢
      • 2019-08-19
      • 1970-01-01
      • 1970-01-01
      • 2014-11-26
      • 2014-11-29
      • 2016-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多