gpt4 book ai didi

javascript - 如果 AJAX 是异步的,为什么我们要使用 setTimeout 函数?

转载 作者:行者123 更新时间:2023-11-30 05:41:41 25 4
gpt4 key购买 nike

我一直在使用 jquery 库来实现 AJAX。没关系,我对此很满意。但是,我开始阅读一些 ajax 书籍并发现了以下代码。

// stores the reference to the XMLHttpRequest object
var xmlHttp = createXmlHttpRequestObject();
// retrieves the XMLHttpRequest object
function createXmlHttpRequestObject()
{
// will store the reference to the XMLHttpRequest object
var xmlHttp;
// if running Internet Explorer
if(window.ActiveXObject)
{
try
{
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
}
catch (e)
{
xmlHttp = false;
}
}// if running Mozilla or other browsers
else
{
try
{
xmlHttp = new XMLHttpRequest();
}
catch (e)
{
xmlHttp = false;
}
}
// return the created object or display an error message
if (!xmlHttp)
alert("Error creating the XMLHttpRequest object.");
else
return xmlHttp;
}

// make asynchronous HTTP request using the XMLHttpRequest object
function process()
{
// proceed only if the xmlHttp object isn't busy
if (xmlHttp.readyState == 4 || xmlHttp.readyState == 0)
{
// retrieve the name typed by the user on the form
name = encodeURIComponent(document.getElementById("myName").value);
// execute the quickstart.php page from the server
xmlHttp.open("GET", "quickstart.php?name=" + name, true);
// define the method to handle server responses
xmlHttp.onreadystatechange = handleServerResponse;
// make the server request
xmlHttp.send(null);
}
else
// if the connection is busy, try again after one second
setTimeout('process()', 1000);
}


//executed automatically when a message is received from the server
function handleServerResponse()
{
// move forward only if the transaction has completed
if (xmlHttp.readyState == 4)
{
// status of 200 indicates the transaction completed successfully
if (xmlHttp.status == 200)
{
// extract the XML retrieved from the server
xmlResponse = xmlHttp.responseXML;
// obtain the document element (the root element) of the XML structure
xmlDocumentElement = xmlResponse.documentElement;
// get the text message, which is in the first child of
// the the document element
helloMessage = xmlDocumentElement.firstChild.data;
// update the client display using the data received from the server
document.getElementById("divMessage").innerHTML =
'<i>' + helloMessage + '</i>';
// restart sequence
setTimeout('process()', 1000);
}
// a HTTP status different than 200 signals an error
else
{
alert("There was a problem accessing the server: " + xmlHttp.statusText);
}
}
}

我的问题是为什么我们在 handleServerResponse() 函数中使用 setTimeout('process()', 1000);?我们不能没有 setTimeout('process()', 1000); 吗?

最佳答案

对我来说,它看起来像是某种持续轮询。它每秒一遍又一遍地重复使用 AJAX 请求,当前一个请求仍然有效时,它会再等一秒钟再次发送它。所以这不仅仅是创建 AJAX 请求并处理响应

使用该代码,页面将根据从服务器检索到的信息不断更新。每当服务器响应发生变化时,页面也会发生变化但不是实时的(仅在下一个请求完成时)。它类似于 Periodic Refresh .

作为一种演变,您可以使用长轮询,在其中生成 AJAX 请求,然后等待服务器响应。如果服务器中有任何信息,您将立即收到响应。如果在您等待响应时,服务器为您发送了任何内容,您将收到它。如果您的请求超时,服务器将以空主体响应。然后,您的客户端将产生另一个 AJAX 请求。您可以获得更多信息 from the Wikipedia .附加链接:Comet .

关于javascript - 如果 AJAX 是异步的,为什么我们要使用 setTimeout 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20470750/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com