0

我是 Web 开发的新手,并且一直在阅读 AJAX,以便我可以使用新数据实时更新地图。我正在阅读一篇关于 Comet 的 IBM 文章。它们为 Apache Tomcat 提供了一个实现。

文章:http ://www.ibm.com/developerworks/web/library/wa-cometjava/#resources

他们提供的 JavaScript 代码如下..

<SCRIPT TYPE="text/javascript">
            function go(){
                var url = "http://localhost:8484/WeatherServer/Weather"
                var request =  new XMLHttpRequest();
                request.open("GET", url, true);
                request.setRequestHeader("Content-Type","application/x-javascript;");
                request.onreadystatechange = function() {
                    if (request.readyState == 4) {
                        if (request.status == 200){
                            if (request.responseText) {
                                document.getElementById("forecasts").innerHTML = 
request.responseText;
                            }
                        }
                        go();
                    }
                };
                request.send(null);
            }
        </SCRIPT>
    </head>
    <body>
        <h1>Rapid Fire Weather</h1>
        <input type="button" onclick="go()" value="Go!"></input>
        <div id="forecasts"></div>
    </body>

我明白这一切,但有几个问题。

1) request.send() 是否产生一个新线程?2) 递归调用 go() 最终会导致堆栈溢出吗?

4

3 回答 3

0

go() 只会在请求成功时执行,所以你一次应该只有一个请求我不认为它会导致堆栈溢出,但递归函数可能会导致它就像在任何其他语言中一样。在 JavaScript 中,Ajax 请求可以异步或非异步模式执行,open() 方法的最后一个参数将确定要使用的模式,您可以在此处找到更多详细信息http://www.w3schools.com/ajax/ajax_xmlhttprequest_send.asp希望能帮助到你 :)

于 2013-05-12T22:54:03.947 回答
0

request.send()是异步的——无论是在内部产生一个新线程还是重用某个现有线程都是实现细节,但是当最后一个参数request.open是时true,它应该是异步的。

request.send()异步一样,onreadystatechange调用(稍后会发生)不会与 original 共享堆栈go。所以我希望堆栈溢出是不可能的。

于 2013-05-12T22:58:34.073 回答
0

当你这样做时将创建一个新线程,request.send()除非你在 open-method 中明确指定不要。

调用go永远不会导致堆栈溢出异常。这是因为它是在回调中调用的,当数据返回时调用堆栈将被重置。它可能看起来像一个递归函数,但它不是。尽管它是在 go-function 内部定义的,但执行上下文将完全不同。

于 2013-05-12T22:59:04.827 回答