2011-06-25 83 views
0

我有试图从以下面的方式呼叫功能捕获返回值的函数:无法从JavaScript函数返回一个对象的值

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

我在做什么错?

回答

1
  1. 该函数不返回任何
  2. 你打电话功能的时刻,(目前不存在)的返回值被分配到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); 

} 
0

函数xhrRetrieve没有返回值。你期望发生什么?

+0

没有了'返回obj.select.toString();'内'xhr.onreadystatechange'实现这一目标? – daniel0mullins

+0

不,只有当XHR事件被触发时才会发生。如果你想阻塞呼叫,你需要在调用xhr.send时设置async = false;或者更好地使用异步解决方案,比如Bjorn发布的片段。 – Mikola

0

你有两个功能在那里。内部函数返回一个值,但不是外部函数。内部函数是一个事件处理程序,所以返回值不会去任何地方。你的XMLHttpRequest是异步的,所以你不会马上得到一个返回值。请参阅此帖以获得更详细的解释:parameter "true" in xmlHttpRequest .open() method

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(); 
     } 
    } 
}