javascript - 运行重复的 javascript 获取请求会很快填满浏览器内存。有没有办法防止这种情况?
问题描述
我正在构建一个网页,该网页显示包含图像的实时事件流。为此,我决定尝试使用运行客户端的 javascript 和下面的代码每 1 秒从我的 API 端点获取数据(然后相应地更新 html)。我注意到每个获取请求的结果都保存在内存中,这将很快填满浏览器的内存,特别是如果按计划运行几个小时或一整天。
我搜索了互联网,发现我可以将创建的对象设置为 null 以将它们标记为安全以清除垃圾收集器,但我是 javascript 新手,我不确定实际设置为 null 的位置/内容. 你知道我应该在下面的代码中将什么设置为 null 吗?
如果有任何其他解决方案,将不胜感激。
代码:编辑:删除 setTimeout(1) - 仍然得到上述相同的行为
let myHeaders = new Headers();
myHeaders.append("xxxx", "xxxxxx");
myHeaders.append("Content-Type", "text/plain");
let raw = "{x:x}";
let requestOptions = {
method: 'POST',
headers: myHeaders,
body: raw,
redirect: 'follow'
};
function printResult(result){
console.log(result);
}
function getLatestRecords(){
fetch("https://xxxx.xxxx.com", requestOptions)
.then(response => response.json())
.then(result => printResult(result))
.catch(error => console.log('error', error));
//setTimeout(1)
}
let interval = setInterval(
function() {
getLatestRecords()
},
1000
);
看起来正在为每次提取创建数据对象:
解决方案
目前尚不清楚这是否与您的内存泄漏有关,但您正在setTimeout
以一种奇怪的方式使用。setTimeout
用于调度在一定毫秒数后调用的回调;setTimeout(1)
是未定义的行为。
由于您的意图是让您的 fetch 请求在 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));
}
推荐阅读
- java - java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“java.util.Iterator java.util.ArrayList.iterator()”
- java - 您将如何为构造函数创建测试?
- python - 如何在不使用 for 循环的情况下仅更新二维列表中的选定值?
- python - 保持具有相同结果的行或应该有一些熊猫的行
- javascript - 如何使用firebase auth在nodejs的服务器端验证用户电话号码
- android - 如何使用 Kotlin 从 EditText 获取 LiveData 值并在 TextView 中显示?MVVM
- vue.js - 不支持的 URL 类型“npm:”:npm:vue-loader@^16.0.0-beta.3
- angular - 角度路由中的 CanActivate 保护,无需重复“CanActivate”属性
- python - 为什么不把转换后的文件放到桌面?
- java - TextSecure 信号服务器 - 证书错误