返回属性(XHR)上未定义
问题描述:
未定义在xhr帖子上返回。我不知道问题在哪里返回属性(XHR)上未定义
var d=new XMLHttpRequest();
var data;
d.open("POST",b,!0);
d.setRequestHeader("Content-type","application/json");
d.onreadystatechange=function(){
if(d.readyState==4){
var data={status:d.status,text:d.responseText};
return data.text; // this return undefined
}
};
d.send(c);
答
所以首先你为什么要从onreadystatechange返回一些东西? Onreadystatechange是一个回调函数,如果你明确使用它(例如var foo = d.onreadystatechange();),你将不会有任何响应尚未处理。你究竟如何使用该返回值?
其次,我不确定您的语法对于条件“4 == d.readystate;”是否正确我可能是错的,但我认为你必须使用if语句。
第三你也应该确保d.status == 200。如果d.readystate == 4,则请求已完成,但不一定成功。您仍然需要检查以确保请求的HTTP状态为200 OK。
如果我不清楚,我很抱歉。这整个事情已经写在手机上。让我知道你是否需要一些例子。希望这可以帮助!
答
由于您正在执行异步XMLHttpRequest,因此无法从onreadystatechange
回调中返回值。相反,您必须使用该回调中的结果或调用其他函数并将结果传递给它。从该回调中返回一个值,只需将其返回到XHR引擎的内部 - 它永远不会进入您的代码。
此外,您需要确保readyState === 4
(表示请求已完成)并且您有成功的响应代码,或者您需要处理错误代码。下面看看如何:
var d = new XMLHttpRequest();
d.open("POST", url, true);
d.setRequestHeader("Content-type","application/json");
d.onreadystatechange = function(){
// if request has finished
if (this.readyState === 4){
// if request finished successfully
if (this.status === 200) {
// process this.responseText here
} else {
// process this.status error response code here
}
}
}
};
d.send(data);
此外,一个字符变量不会使您的代码更具可读性。强烈建议您为所有变量使用有意义的名称。代码可以在部署前用最小化器缩短,同时保留用于编辑和维护的可读版本。