javascript - 获取时如何避免数据重复?
问题描述
我有一个简单的 fetch 函数,它获取数据(来自 db 的消息)并将其放入数组中以使用简单的 vanilla JS 显示它。问题是我每 2 秒调用一次此函数以检查新消息。但是当我这样做时,我会复制我的消息并且它会不断添加而不是替换。我正在努力理解我应该做些什么来改变,而不是添加。
(有点愚蠢的问题,对不起)
const list = document.getElementById('message-list');
const getData = () => {
fetch('/messages')
.then((resp) => resp.json())
.then(function(data) {
console.log(data)
for (let i = 0; i < data.length; i++) {
const listItem = document.createElement('li');
listItem.innerText = data[i].message;
const delButton = document.createElement('button');
delButton.innerHTML = 'Delete';
delButton.addEventListener('click', ()=>{
const message_id = data[i].message_id;
deleteItem(message_id);
})
listItem.appendChild(delButton);
list.appendChild(listItem)
}
})
}
setInterval(getData,2000)
解决方案
message_id
到目前为止,制作一组已处理的s,并在进一步调用时,忽略匹配的消息message_id
:
const seenIds = new Set();
const getData = () => {
fetch('/messages')
.then((resp) => resp.json())
.then(function(data) {
data
.filter(({ message_id }) => !seenIds.has(seenIds))
.forEach(({ message, message_id }) => {
seenIds.add(message_id);
const listItem = document.createElement('li');
listItem.innerText = message;
const delButton = document.createElement('button');
delButton.textContent = 'Delete';
delButton.addEventListener('click', () => {
deleteItem(message_id);
});
listItem.appendChild(delButton);
list.appendChild(listItem)
});
});
};
也就是说,更改您的后端可能会更好,以便它可以为您过滤项目,而不是通过网络发送继续被忽略的对象。
推荐阅读
- python - 如何将网页抓取转换为 django api?
- azure-devops-rest-api - 编辑其他用户的拉取请求评论
- c# - 在等待 Navigation.PushAsync 时显示 Toast
- react-native - 数据更改时 Flatlist 不更新
- r - 如何将数据导入 R 并保持我的列名完全相同?
- gradle - 不同环境下的 Teamcity gradle 命令行参数
- powershell - 如何在不使用 Powershell 脚本的情况下安排 Windows 服务
- python - 如何在 python 的 exe.file 中包含 sqlite 数据库?
- java - 我们可以在 NestJS 中同时拥有缓存名称和缓存键吗?
- python - 使用 mpmath.runtests() 测试失败