AJAX调用Elasticsearch导致XHR对象的内存泄漏

时间:2015-07-22 22:56:15

标签: javascript jquery ajax elasticsearch xmlhttprequest

我目前正在尝试使用D3从Elasticsearch服务器加载其数据来构建折线图,并且在刷新时,根据x轴上的新边界重新加载数据。这已经实现,但是当JavaScript代码使用AJAX请求(通过jQuery)加载和重新加载数据时,旧的AJAX请求被保留并且它们的内存未被释放(如浏览器检查器中所示)。这可能是因为浏览器对AJAX调用产生的XHR对象的内部引用,但我不确定。下面是执行查询的函数之一(它最终调用“minMaxLoaded”回调函数,其中继续执行使用数据。我尝试了很多策略,例如将AJAX调用存储在变量中,然后将它们设置为null,但是无济于事。据我所知,由于这一切都包含在一个函数中,因此JavaScript函数应该在函数完成后消失,并且请求应该被垃圾回收。无论如何,你可以去:

function queryMinMax(domain, index) {
    var absMin;
    var absMax;

    var minmaxQuery = {
        "aggregations" : {
            "minTime" : {
                "top_hits" : {
                    "size" : 1,
                    "sort" : [ { "timestamp" : { "order" : "asc" } } ]
                }
            },
            "maxTime" : {
                "top_hits" : {
                    "size" : 1,
                    "sort" : [ { "timestamp" : { "order" : "desc" } } ]
                }
            }
        }
    };

    $.ajax({
        url: domain + index + "/_search?search_type=count",
        type: "POST",
        dataType: "json",
        data: JSON.stringify(minmaxQuery),

        success: function(response) {
            absMin = parseDate(response.aggregations.minTime.hits.hits[0]._source["timestamp"]).getTime();
            absMax = parseDate(response.aggregations.maxTime.hits.hits[0]._source["timestamp"]).getTime();
            minMaxLoaded(absMin, absMax);
        }
    });
}

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

似乎Safari Web控制台会跟踪其打开时所做的响应。处理时间减慢的原因是因为这个原因。如果Web控制台已关闭,则问题就消失了。