无法从JavaScript函数返回对象的值

时间:2011-06-25 01:24:00

标签: javascript jquery oop xmlhttprequest

我有一个函数试图以下列方式从调用函数中捕获返回值:

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

我做错了什么?

4 个答案:

答案 0 :(得分:1)

  1. 该功能不会返回任何内容
  2. 当您调用函数时,(当前不存在的)返回值将分配给select。在同一时刻,你的ajax请求被解雇,这需要时间来完成;在ajax请求完成(并成功)之前,不会调用回调函数。
  3. 这应该有效:

    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