TypeError:无法读取未定义的属性“then”
Posted
技术标签:
【中文标题】TypeError:无法读取未定义的属性“then”【英文标题】:TypeError: Cannot read property 'then' of undefined 【发布时间】: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 函数。希望能带来更多见解。
【参考方案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 搜索,结果应该会出来。
【讨论】:
以上是关于TypeError:无法读取未定义的属性“then”的主要内容,如果未能解决你的问题,请参考以下文章
反应笑话单元测试用例TypeError:无法读取未定义的属性'then'
正确使用 Promise.resolve().then() 错误:未捕获(在承诺中):TypeError:无法读取属性
TypeError:无法从google-auth-library读取未定义的属性'opts'