简体   繁体   English

如何在获取时避免数据重复?

[英]How to avoid data duplication while fetching?

I have a simple fetch function that gets data (messages from db) and putting it into an array to display it with simple vanilla JS.我有一个简单的 fetch 函数,它获取数据(来自 db 的消息)并将其放入一个数组中以使用简单的 vanilla JS 显示它。 The thing is I am calling this function every 2 seconds in order to check for new messages.问题是我每 2 秒调用一次此函数以检查新消息。 But when I do that I duplicate my messages and it keeps adding instead of replacing.但是当我这样做时,我会复制我的消息,并且它会不断添加而不是替换。 I am struggling to understand what I should do to change, not add.我正在努力理解我应该做些什么来改变,而不是添加。

(a little dummy question, sorry) (一个小问题,抱歉)

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) setInterval(getData,2000)

Make a Set of the message_id s processed so far, and on further calls, ignore messages matching that message_id :制作一组迄今为止已处理的message_id ,并在进一步调用时忽略与该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)
        });
      });
};

That said, it would probably be better to change your backend so that it can filter the items for you, rather than sending objects over the net that proceed to get ignored.也就是说,最好更改您的后端,以便它可以为您过滤项目,而不是通过网络发送继续被忽略的对象。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM