我有一个函数试图以下列方式从调用函数中捕获返回值:
var select = xhrRetrieve(projID);
以下是xhrRetrieve函数的示例:
function xhrRetrieve(projID) {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if(xhr.readyState == 4) {
if(xhr.status == 200) {
var obj = $.parseJSON(xhr.responseText);
return obj.select.toString();
}
}
}
var url = "ajax.cgi";
var data = "action=retrieve-opp&proj-id=" + projID;
xhr.open("POST",url);
xhr.setRequestHeader("Content-Type","application/x-www-urlencoded");
xhr.send(data);
}
我正在使用jQuery和直接的JavaScript。每当我尝试使用:
获取obj.select的值var select = xhrRetrieve(projID);
选择始终返回undefined
。
我做错了什么?
答案 0 :(得分:1)
select
。在同一时刻,你的ajax请求被解雇,这需要时间来完成;在ajax请求完成(并成功)之前,不会调用回调函数。 这应该有效:
function doStuffWithTheAjaxResponse(select) {
// do stuff
}
function xhrRetrieve(projID) {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if(xhr.readyState == 4) {
if(xhr.status == 200) {
var obj = $.parseJSON(xhr.responseText);
doStuffWithTheAjaxResponse(obj.select.toString());
}
}
}
var url = "ajax.cgi";
var data = "action=retrieve-opp&proj-id=" + projID;
xhr.open("POST",url);
xhr.setRequestHeader("Content-Type","application/x-www-urlencoded");
xhr.send(data);
}
答案 1 :(得分:1)
由于请求是异步的,因此函数将在onreadestatechange中的代码触发之前返回。您可以切换到同步并在函数返回之前获取值:
function xhrRetrieve(projID) {
var returnVal;
var xhr = new XMLHttpRequest();
var url = "ajax.cgi";
var data = "action=retrieve-opp&proj-id=" + projID;
//3rd param is false to switch to synchronous
xhr.open("POST",url, false);
xhr.setRequestHeader("Content-Type","application/x-www-urlencoded");
xhr.send(data);
if(xhr.readyState == 4) {
if(xhr.status == 200) {
var obj = $.parseJSON(xhr.responseText);
return obj.select.toString();
}
}
}
答案 2 :(得分:0)
函数xhr Retrieve没有返回值。你期望发生什么?
答案 3 :(得分:0)
你有两个功能。内部函数返回一个值,但不返回外部值。内部函数是一个事件处理程序,因此返回值不会去任何地方。您的XMLHttpRequest是异步的,因此您不会立即获得返回值。有关更详细的说明,请参阅此帖子:parameter "true" in xmlHttpRequest .open() method