我是网络开发的新手,并且一直在阅读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()的递归调用最终会导致堆栈溢出吗?
答案 0 :(得分:0)
go()只会在请求成功时执行,因此您一次只能有一个请求,我认为它不会导致堆栈溢出,但递归函数可能会导致它像任何其他语言一样。在JavaScript中,Ajax请求可以在异步模式或非异步模式下执行,open()方法的最后一个参数将确定要使用的模式,您可以在此处找到更多详细信息http://www.w3schools.com/ajax/ajax_xmlhttprequest_send.asp希望它有帮助:)
答案 1 :(得分:0)
request.send()
是异步的 - 无论是在内部生成新线程还是重用某个现有线程都是实现细节,但当request.open
的最后一个参数为true
时,它应该是异步的
由于request.send()
是异步的,onreadystatechange
调用(稍后会发生)不会与原始go
共享堆栈。所以我希望堆栈溢出是不可能的。
答案 2 :(得分:0)
执行request.send()
时将创建一个新线程,除非您在open方法中明确指定。
对go
的调用永远不会导致stackoverflow异常。这是因为它在回调中被调用,并且在数据返回时将重置调用堆栈。它可能看起来像一个递归函数,但事实并非如此。虽然它是在go-function中定义的,但执行上下文将完全不同。