Sobes.tech
Middle

Onze chatapplicatie moet nieuwe berichten die vanaf de server komen zo snel mogelijk weergeven. Het bericht heeft het volgende formaat: interface Message { id: number text: string } De id van het eerste bericht is 1, en de id van elk volgend bericht is 1 groter dan die van het vorige. We moeten de berichten in de juiste volgorde weergeven, maar de server garandeert niet de juiste volgorde van de berichten die naar onze applicatie worden gestuurd. Tijdlijn: // (komt binnen) [telefoon] // (tekenen) . 1 2 3 . . 4 5 6 7 8 Gebruik de functie render om de berichten weer te geven: render(message)

sobes.tech AI

Antwoord van 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, это уже отрендеренное или дубликат — игнорируем
}

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