Sobes.tech
Middle

Naše chatová aplikace by měla zobrazovat nové zprávy, které přicházejí ze serveru, co nejrychleji. Zpráva má následující formát: interface Message { id: number text: string } ID první zprávy je 1, a ID každé následující zprávy je o 1 větší než ID předchozí. Musíme zobrazovat zprávy ve správném pořadí, ale server nezaručuje správné pořadí zpráv odesílaných na naši aplikaci. Časová osa: // (přichází) [telefon] // (kreslíme) . 1 2 3 . . 4 5 6 7 8 Pro zobrazení zpráv použijte funkci render: render(message)

sobes.tech AI

Odpověď od AI

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

Идея:

  • Хранить в памяти последний отрендеренный 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, это уже отрендеренное или дубликат — игнорируем
}

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