Как мне сделать только обновленную статистику - websockets - PullRequest
0 голосов
/ 21 апреля 2020

прямо сейчас весь div перерисовывается, но я ищу способ только перерисовать обновленную статистику c

это часть того, что у меня сейчас

updatestats. js

document.querySelector("#submit").addEventListener("click", function (e) {
let country = document.querySelector("#country").value
let numberCases = document.querySelector("#number").value

fetch(base_url + "/api/v1/stats/updatestats", {
    method: "put",
    headers: {
        "Content-Type": "application/json"
    },
    body: JSON.stringify({
        "country": country,
        "numberCases": numberCases
    })
}).catch(err => {
    console.log(err);
})

primus.write({ "action": "update" })

stats. js

 primus.on("data", (json) => {
    if (json.action === "update") {
        document.querySelector("#overview").innerHTML = ""
        appendInfo()
    }
})

function appendInfo() {
    fetch(base_url + "/api/v1/stats", {
        method: "get",
        headers: {
            'Content-Type': 'application/json'
        },
    }).then(response => {
        return response.json();
    }).then(json => {
        json.data.stats.forEach(stat => {
            let country = stat.country
            let numberCases = stat.numberCases
            let p = document.createElement('p')
            let text = document.createTextNode(`${country}:   ${numberCases}`)
            p.appendChild(text)
            let overview = document.querySelector("#overview")
            overview.appendChild(p)
        })
    }).catch(err => {
        console.log(err);
    })
}


window.onload = appendInfo();

stats.pug

body
h1 Cases by country
div#overview

Так что, если я обновлю только страну Бельгия, я только хочу, чтобы статистика c была изменена. Теперь все, кажется, перезагрузить

Ответы [ 2 ]

1 голос
/ 21 апреля 2020

То, что я имел в виду с моим предложением, - это поддерживать передачу данных между клиентом и сервером строго в сокетах. Это означает, что когда один пользователь обновляет 1 значение на своем конце, это значение будет отправлено на сервер и сохранено. После того как сервер завершит сохранение значения, это же значение будет отправлено всем другим клиентам. Таким образом, вы будете отправлять и получать только те детали, которые были изменены, без необходимости загружать все при каждом изменении.

Я не смог бы написать код точно так, как должен, поскольку у меня ограниченный опыт работы с Primus. js и мало знаю о вашем бэкэнде.

Но я бы подумал, что ваш интерфейс будет выглядеть примерно так. В приведенном ниже примере я удалил функцию fetch из события click. Вместо этого отправьте измененные данные на сервер, который должен обрабатывать эти дорогостоящие задачи.

const countryElement = document.querySelector("#country");
const numberCasesElement = document.querySelector("#number");
const submitButton = document.querySelector("#submit");

submitButton.addEventListener("click", function (e) {

  let data = {
    action: 'update',
    country: countryElement.value,
    numberCases: numberCasesElement.value
  };

  primus.write(data);

});

Теперь сервер должен получить сообщение о том, что один из клиентов обновил некоторые данные. И должен что-то делать с этими данными, например, хранить их и сообщать другим клиентам, что этот фрагмент данных обновлен.

primus.on('data', data => {
  const { action } = data;
  if (action === 'update') {

    // Function that saves the data that the socket received.
    // saveData(data) for example.

    // Send changed data to all clients.
    primus.write(data);

  }
});

Теперь сервер должен был сохранить изменения и передать их всем остальным. клиентов. Теперь вы сами и другие получите данные, которые были изменены, и теперь можете их отобразить. Итак, вернемся к интерфейсу. Мы делаем то же самое, что и на сервере, прослушивая событие data и проверяя действие в объекте данных, чтобы выяснить, что делать.

Вам понадобится способ выяснить, как нацеливаться элементы, которые вы хотите изменить, вы можете сделать это, имея атрибуты id на ваших элементах, которые соответствуют данным. Так, например, вы хотите изменить параграф «Бельгия», тогда он пригодится, если есть способ его распознать. Я не буду вдаваться в go в это слишком много, а просто создам что-то простое, что может помочь.

В приведенном ниже примере HTML я дал абзацу идентификатор. Этот идентификатор совпадает со значением страны, которую вы хотите обновить. Это уникальный идентификатор для поиска элемента, который вы хотите обновить. Или даже создать, если его там нет.

Пример JavaScript после этого получает данные от сервера через сокеты и проверяет действие. Это те же данные, которые мы отправляем на сервер, но только теперь, когда все получили, мы что-то делаем с ними.

Я написал функцию, которая обновит данные в вашем HTML. Он проверит наличие элемента с идентификатором, который соответствует стране, и соответствующим образом обновит свойство textContent. Это почти то же самое, что и использование document.createTextNode, но с меньшим количеством шагов.

<div id="overview">
  <p id="Belgium">Belgium: 120</p>
</div>
const overview = document.querySelector("#overview");

primus.on('data', data => {
  const { action } = data;
  if (action === 'update') {
    updateInfo(data);
  }
});

function updateInfo(data) {
  const { country, numberCases } = data;

  // Select existing element with country data.
  const countryElement = overview.querySelector(`#${country}`);

  // Check if the element is already there, if not, then create it.
  // Otherwise update the values.
  if (countryElement === null) {
    const paragraph = document.createElement('p');
    paragraph.id = country;
    paragraph.textContent = `${country}: ${numberCases}`;
    overview.append(paragraph);
  } else {
    countryElement.textContent = `${country}: ${numberCases}`;
  }
}

Я надеюсь, что это то, что вы ищете и / или полезно для того, что вы пытаетесь создать. Я хочу еще раз сказать, что это пример того, как это могло бы работать и не было проверено с моей стороны.

Если у вас есть какие-либо вопросы или я неясен, то, пожалуйста, не стесняйтесь спрашивать.

0 голосов
/ 21 апреля 2020

Чтобы уточнить предложение @ EmielZuurbier в комментарии, попробуйте следующий код.

//Client-side

primus.emit('data',data);

primus.on("dataUpdated", (json) => {

});

//Server-side

primus.on('data',data =>{

//process it here and then
//send it out again


primus.emit('dataUpdated','the data you want to send to the front end');

})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...