运行重复的javascript获取请求会很快填满浏览器内存。有没有办法防止这种情况?

运行重复的javascript获取请求会很快填满浏览器内存。有没有办法防止这种情况?,javascript,fetch-api,Javascript,Fetch Api,我正在构建一个网页,显示包含图像的实时事件流。为此,我决定尝试使用运行javascript的客户端和下面的代码,每1秒从API端点获取一次数据(然后相应地更新html)。我注意到,每个获取请求的结果都被持久化在内存中,这将很快填满浏览器的内存,特别是如果按计划运行几个小时或一整天 我在互联网上搜索过,发现我可以将创建的对象设置为null,以将它们标记为垃圾收集器可以安全清除的对象,但我不熟悉javascript,我不确定在哪里/什么地方实际设置为null。你知道我应该在下面的代码中将什么设置为n

我正在构建一个网页,显示包含图像的实时事件流。为此,我决定尝试使用运行javascript的客户端和下面的代码,每1秒从API端点获取一次数据(然后相应地更新html)。我注意到,每个获取请求的结果都被持久化在内存中,这将很快填满浏览器的内存,特别是如果按计划运行几个小时或一整天

我在互联网上搜索过,发现我可以将创建的对象设置为null,以将它们标记为垃圾收集器可以安全清除的对象,但我不熟悉javascript,我不确定在哪里/什么地方实际设置为null。你知道我应该在下面的代码中将什么设置为null吗

如果有任何其他解决方案,我们将非常感谢您的指导

代码: EDIT:Removed setTimeout(1)-仍然获得与上述相同的行为

让myHeaders=newheaders();
myHeaders.append(“xxxx”、“xxxxxx”);
追加(“内容类型”、“文本/普通”);
设raw=“{x:x}”;
让请求选项={
方法:“POST”,
标题:myHeaders,
身体:生的,
重定向:“跟随”
};
函数printResult(结果){
控制台日志(结果);
}
函数getLatestRecords(){
取回(“https://xxxx.xxxx.com“,请求选项)
.then(response=>response.json())
。然后(结果=>printResult(结果))
.catch(error=>console.log('error',error));
//设置超时(1)
}
let interval=setInterval(
函数(){
getLatestRecords()
},
1000
);
似乎正在为每次提取创建数据对象:


目前尚不清楚这是否与内存泄漏有关,但您正在以一种奇怪的方式使用
setTimeout
。用于安排在特定毫秒数后调用回调<代码>设置超时(1)是未定义的行为

由于您的目的是在1秒后取消提取请求,因此您需要执行以下操作:

function getLatestRecords(){
    var controller = new AbortController();
    setTimeout(() => controller.abort(), 1000);
    return fetch("https://xxxx.xxxx.com", { ...requestOptions, signal: controller.signal })
        .then(response => response.json())
        .then(result => printResult(result))
        .catch(error => console.log('error', error));
}

这可能是因为您正在控制台上记录它们。每次控制台记录一个对象时,它都会在控制台上创建该对象的副本。嗨,Adrian。谢谢,我只是尝试了一下,没有控制台记录它们,但看起来内存仍然在被填满,这是什么
setTimeout(1)
?看起来您的开发工具正在保存每个获取的副本,所以这可能就是漏洞所在。除非您正在执行未在代码中发布的其他操作,否则不应导致内存泄漏。如果您希望请求超时,如果需要太长时间来取消请求,则据我所知,您不能在
fetch()
中执行此操作。使用
XMLHttpRequest
是可能的,但没有那么简单。今天我学习了
AbortController
!谢谢@Jacob谢谢你,Jacob!以我以前的方式删除setTimeout修复了这个问题,现在GC可以正常工作了。我将使用此方法来超时继续进行的请求,谢谢。很高兴这么简单!谁会想到
setTimeout(1)
会导致内存泄漏?奇怪。是的,疯狂-奇怪的行为,尽管我用错了。