Sobes.tech
Middle

Meie vestlusrakendus peaks võimalikult kiiresti kuvama serverist saabuvad uued sõnumid. Sõnumi formaat: interface Message { id: number text: string } Esimese sõnumi ID on 1, ja iga järgmise sõnumi ID on suurem kui eelmine ühe võrra. Me peame kuvama sõnumeid õiges järjekorras, kuid server ei taga saadetud sõnumite õiget järjekorda. Ajaskaala: // (saabub) [telefon] // (joonistame) . 1 2 3 . . 4 5 6 7 8 Sõnumite kuvamiseks kasutage funktsiooni render: render(message)

sobes.tech AI

Vastus AI-lt

Чтобы отображать сообщения в правильном порядке, несмотря на возможный приход сообщений с сервера в произвольном порядке, можно реализовать буферизацию и последовательный рендеринг.

Идея:

  • Хранить в памяти последний отрендеренный id сообщения (например, lastRenderedId).
  • При получении нового сообщения:
    • Если message.id === lastRenderedId + 1, сразу рендерим и увеличиваем lastRenderedId.
    • Если message.id > lastRenderedId + 1, сохраняем сообщение в буфер (например, объект или Map).
    • После рендера сообщения проверяем буфер, есть ли следующее сообщение (lastRenderedId + 1), и если есть — рендерим его, обновляем lastRenderedId и повторяем проверку.

Пример реализации:

const buffer = new Map();
let lastRenderedId = 0;

function onMessageReceived(message) {
  if (message.id === lastRenderedId + 1) {
    render(message);
    lastRenderedId++;

    // Проверяем, есть ли в буфере следующее сообщение
    while (buffer.has(lastRenderedId + 1)) {
      const nextMsg = buffer.get(lastRenderedId + 1);
      buffer.delete(lastRenderedId + 1);
      render(nextMsg);
      lastRenderedId++;
    }
  } else if (message.id > lastRenderedId + 1) {
    // Сообщение пришло раньше времени, сохраняем в буфер
    buffer.set(message.id, message);
  }
  // Если message.id <= lastRenderedId, это уже отрендеренное или дубликат — игнорируем
}

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