如果AJAX是异步的,为什么我们使用setTimout函数?

时间:2013-12-09 12:30:41

标签: javascript ajax

我一直在使用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);?

,我们不能这样做

2 个答案:

答案 0 :(得分:1)

对我来说,它看起来像某种常量轮询。它每秒都在重复使用AJAX请求,当前一个请求仍处于活动状态时,它会等待另一秒钟再次发送它。所以它不只是创建一个AJAX请求并处理响应

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

作为一种演变,您可以使用Long Polling生成AJAX请求,然后等待服务器响应。如果服务器中有任何信息,您将立即收到响应。如果,当您在等待响应时,任何东西都会为您服务器,您将收到它。如果您的请求超时,服务器将以空体响应。然后,您的客户端将生成另一个AJAX请求。您可以获得更多信息from the Wikipedia。额外链接:Comet

答案 1 :(得分:0)

在给定的示例中,本书已在body onload事件上调用process()函数。 当我将代码更改为onload-&gt; to onkeyup <input type="text" id="myName" onkeyup="process()"/>我可以删除代码//setTimeout('process()', 1000);