【问题标题】:Javascript setInterval with ajax call making site slow带有ajax调用的Javascript setInterval使网站变慢
【发布时间】:2015-04-29 19:25:15
【问题描述】:

我在 javascript 中实现了 setInterval() 函数,它每 2 分钟进行一次 AJAX 调用。 ajax 调用返回我在 html 中附加的数据。我不知道为什么,但它使网站变得非常缓慢,逐渐。该网站是用node js开发的。我搜索了这个问题并了解了clearInterval() 函数。但我无法正确使用它。有人可以给我一个正确清除间隔的通用示例吗?或者这是与 node js 相关的其他问题?

代码如下:

setInterval(function() {    
appendData(skipCount);}, 120000);

function appendData(_popularSkipCount) {
    var cookieValue = $.cookie('type');         
    var _data = {
        "limit": defaultLimit - 1,
        "skipCount": _popularSkipCount
    }               
    $.ajax({
        type: "GET",
        url: "/popular/" + cookieValue,
        data: _data,
        async: true,
        success: function (data) {  
            $("#data-box").empty();
            if($(data).size() > 0) {
                for(var i = 0; i < $(data).size() ; i++) {
                    var html = "<div class='large-12 columns popular'><img class='image' src='" + $(data)[i].url + "' class='popular-img'><a href='/abc/" + $(data)[i].slug + "'><h4>" + name + "</h4></a><h5>" + city + "</h5></div>";
                    $(html).hide().appendTo("#data-box").fadeIn(1000);
                }
            } else {
                appendData("0");
            }               
        },
        error: function(jqXHR, textStatus, errorthrown) {                             
            $("#data-box").empty();
            console.log(errorthrown);
        }
    });     
};

【问题讨论】:

  • 我猜你使用synchronous ajax 调用太频繁了。从而导致网站变慢
  • 自行提供相关代码
  • 请添加您的代码
  • @Praveen 或者附加内容很大
  • 我建议不要使用setInterval。相反,根据您的要求,您可以实现类似Publish/Subscribe 的机制。这个想法是每当发生任何新的数据更改时,服务器都应该直接向客户端发送响应,从而消除setInterval的使用

标签: javascript jquery ajax node.js


【解决方案1】:

clearInterval() 方法清除使用 setInterval() 方法设置的计时器。

下面是一个示例代码

var myVar = setInterval(function(){ setColor() }, 300);

function setColor() {
    var x = document.body;
    x.style.backgroundColor = x.style.backgroundColor == "yellow" ? "pink" : "yellow";
}

function stopColor() {
    clearInterval(myVar);
}

【讨论】:

    【解决方案2】:

    如果您只需要多次调用 AJAX 'X',您可以执行以下操作:

    var intervalCount = 0;
    
    var myAjax = setInterval(function(){ 
        myAjaxCall();
    }, 2000);
    
    function myAjaxCall() {
        // Some AJAX call here.
        window.console.log('AJAX Call: ' + intervalCount);
        intervalCount++;
        if(intervalCount >= 3) {
            clearInterval(myAjax);
            window.console.log('AJAX Calls Stopped');
        }        
    }
    

    这将设置一个间隔来执行您的 AJAX 操作 3 次,然后清除间隔并停止。这可能有助于提高性能,具体取决于您的需要。

    Demohttp://jsfiddle.net/89mwevda/(打开控制台查看日志)。

    再说一次,就性能而言,您的问题/情况并不清楚 真正 是什么导致了您的问题。如果您可以提供一些问题的演示代码,它将帮助您获得更好的答案。

    根据您事后提供的代码进行更新:

    我会避免在循环中操作 DOM(附加内容),而是一次性执行此操作,在您拥有的变量中构建字符串之后。像下面这样的东西应该会更好(尽管未经测试):

    setInterval(function() {    
        appendData(skipCount);
    }, 120000);
    
    function appendData(_popularSkipCount) {
        var cookieValue = $.cookie('type');         
        var _data = {
            "limit": defaultLimit - 1,
            "skipCount": _popularSkipCount
        };
    
        $.ajax({
            type: "GET",
            url: "/popular/" + cookieValue,
            data: _data,
            async: true,
            success: function (data) {  
                $("#data-box").empty();
                if($(data).size() > 0) {
    
                    var html = "";
    
                    for(var i = 0; i < $(data).size() ; i++) {
                        html += "<div class='large-12 columns popular'><img class='image' src='" + $(data)[i].url + "' class='popular-img'><a href='/abc/" + $(data)[i].slug + "'><h4>" + name + "</h4></a><h5>" + city + "</h5></div>";
                    }
    
                    $(html).hide().appendTo("#data-box").fadeIn(1000);
    
                } else {
                    appendData("0");
                }               
            },
            error: function(jqXHR, textStatus, errorthrown) {                             
                $("#data-box").empty();
                console.log(errorthrown);
            }
        });
    
    }
    

    【讨论】:

    • 我必须继续调用 ajax。它永远不应该停止。这样做是否正确?我已将我的代码置于有问题的编辑中。
    • 看到您的代码后,我想说这与您的 setInterval 本身无关,而是与 DOM 操作有关。每次更新 DOM 都会影响性能。我会尝试更新我的答案,看看如何最好地优化这部分。
    猜你喜欢
    • 1970-01-01
    • 2018-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-27
    • 2011-07-08
    • 1970-01-01
    相关资源
    最近更新 更多