返回属性(XHR)未定义

undefined on return property (XHR)

本文关键字:未定义 XHR 属性 返回      更新时间:2023-09-26

未定义返回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);

同样,一个字符变量并不能使你的代码更具可读性。强烈建议对所有变量使用有意义的名称。可以在部署之前使用最小化器缩短代码,同时保留可读版本以供编辑和维护。