如何从正确的JS范围返回变量?

时间:2009-08-27 14:49:08

标签: javascript ajax adobe air

我正在使用JS unde Adob​​e AIR进行一些开发。我想要做的是创建一个远程网站的请求(例如,用于身份验证)。

这个问题与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);
        }

2 个答案:

答案 0 :(得分: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 :(得分:1)

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

您需要对代码进行结构化,以便代替return str而不是您要对返回值执行任何操作 - 例如将它存储在某处,使用alert显示它,将其传递给另一个函数。