2009-08-27 102 views
0

我正在做一些使用JS undefined AIR的开发。我想要做的是创建一个远程网站的请求(例如用于身份验证)。如何从正确的JS范围返回变量?

问题不是AIR相关的,这是一个JS我不能正确的事情。我想要做的是检索请求主体,但如果我只是返回“str”var它显示“未定义”。我试图在函数内部声明它'全局',但它不起作用。我猜测有一些范围问题,我忽略了。

 function doRequest(url){ 
      var req = new XMLHttpRequest(); 

      req.onreadystatechange = function(){ 
       if (req.readyState == 4) { 
        var str = req.responseText; 
        runtime.trace("deRequest result: " + str); 

         return str; 
       } 
      }; 
      req.open('GET', url, true); 
      req.send(null); 
     } 
+0

不是你正在寻找的答案,但我强烈建议你看看一个JavaScript库来抽象出XMLHttpRequest - 比如jQuery,YUI或者原型。 – Magnar 2009-08-27 14:52:15

+0

我在我的AIR项目中使用jQuery,但似乎通常的jQuery方法(get,post,ajax)在AIR下无法正常工作。也许情况并非如此,如果有的话请让我知道!谢谢 – Brayn 2009-08-27 14:53:24

回答

2

你不应该试图捕获onreadystatechange函数的返回值。 XHR是异步的,这意味着只有在请求完成时才会触发此代码。所以你必须准备好在你的回应里面做那个功能。最简单的事情就是传入一个回调函数。

function doRequest(url, callback_func){ 
     var req = new XMLHttpRequest(); 

     req.onreadystatechange = function(){ 
      if (req.readyState == 4) { 
       var str = req.responseText; 
       runtime.trace("deRequest result: " + str); 

       callback_func(str); 
      } 
     }; 
     req.open('GET', url, true); 
     req.send(null); 
    } 

    function callback_func(data) { 
     // do something with your response data 
    } 
1

你将它返回给调用者onreadystatechange,这可能不感兴趣。你也不能在doRequest的末尾返回它,因为在调用req.send(null)之后它会立即返回并且该值尚不可用(仍然可以从服务器获得)。一段时间后,你的onreadystatechange处理程序被调用,你有价值。在这一点上,没有任何用处可以回到它。

您需要构造代码,以便代替return str,您可以随心所欲地处理返回值 - 例如,将它存储在某个地方,使用alert显示它,将它传递给另一个函数。