如何在没有重叠的情况下间隔进行Ajax调用?

The*_*ist 8 javascript ajax settimeout setinterval

我正在寻找一个网页,通过嵌入式Web服务器的AJAX调用来对数据进行采样.我如何设置代码,以便一个请求不与另一个请求重叠?我应该提到我有很少的JavaScript经验,也有一个令人信服的理由不使用大于10千字节的任何大小的外部库.

Dan*_*llo 6

您可能需要考虑仅在上一次AJAX调用成功响应后重新启动AJAX请求的选项.

function autoUpdate()
{
    var ajaxConnection = new Ext.data.Connection();

    ajaxConnection.request(
    {
        method:         'GET',
        url:            '/web-service/', 

        success: function(response) 
        {
            // Add your logic here for a successful AJAX response.
            // ...
            // ...

            // Relaunch the autoUpdate() function in 5 seconds.
            setTimeout(autoUpdate, 5000);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这个例子使用ExtJS,但你可以很容易地使用它XMLHttpRequest.

注意: 如果您必须具有x秒的确切间隔,则必须跟踪从AJAX请求启动到setTimeout()调用的时间,然后从延迟中减去此时间跨度.否则,上述示例中的间隔时间将随着网络延迟和处理Web服务逻辑的时间而变化.


dac*_*cot 1

AJAX,尽管有这个名字,但并不一定是异步的。

这是异步方法...

var req;

function ajax(method,url,payload,action)
    {
    if (window.XMLHttpRequest)
        {
        req = new XMLHttpRequest();
        req.onreadystatechange = action;
        req.open(method, url, true);
        req.send(payload);
        }
    else if (window.ActiveXObject)
        {
        req = new ActiveXObject("Microsoft.XMLHTTP");
        if (req)
            {
            req.onreadystatechange = action;
            req.open(method, url, true);
            req.send(payload);
            }
        else
            {
            alert("Could not create ActiveXObject(Microsoft.XMLHTTP)");
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

...但是这是一个同步等效项...

function sjax(method,url,payload,action)
    {
    if (window.XMLHttpRequest)
        {
        req = new XMLHttpRequest();
        req.open(method, url, false);
        req.send(payload);
        action();
        }
    else if (window.ActiveXObject)
        {
        req = new ActiveXObject("Microsoft.XMLHTTP");
        if (req)
            {
            req.onreadystatechange = action;
            req.open(method, url, false);
            req.send(payload);
            }
        else
            {
            alert("Could not create ActiveXObject(Microsoft.XMLHTTP)");
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

...这是一个典型的动作...

function insertHtml(target)
    {
    var pageTarget = arguments[0];
    if (req.readyState == 4) // 4 == "loaded"
        {
        if (req.status == 200) // 200 == "Ok"
            {
            if (req.responseText.indexOf("error") >= 0)
                {
                alert("Please report the following error...");
                pretty = req.responseText.substring(req.responseText.indexOf("error"),1200);
                pretty = pretty.substring(0,pretty.indexOf("\""));
                alert(pretty + "\n\n" + req.responseText.substring(0,1200));
                }
            else
                {
                div = document.getElementById(pageTarget);
                div.innerHTML = req.responseText;
                dimOff();
                }
            }
        else
            {
            alert("Could not retreive URL:\n" + req.statusText);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)