Middle
Η εφαρμογή συνομιλίας μας πρέπει να εμφανίζει τα νέα μηνύματα που λαμβάνονται από τον διακομιστή όσο το δυνατόν πιο γρήγορα. Το μήνυμα έχει τη μορφή: interface Message { id: number text: string } Το id του πρώτου μηνύματος είναι 1, και το id κάθε επόμενου μηνύματος είναι 1 μεγαλύτερο από το προηγούμενο. Πρέπει να εμφανίζουμε τα μηνύματα με τη σωστή σειρά, αλλά ο διακομιστής δεν εγγυάται τη σωστή σειρά των μηνυμάτων που αποστέλλονται στην εφαρμογή μας. Χρονοδιάγραμμα: // (έρχεται) [τηλέφωνο] // (ζωγραφίζουμε) . 1 2 3 . . 4 5 6 7 8 Για να εμφανίσετε τα μηνύματα, χρησιμοποιήστε τη λειτουργία render: render(message)
sobes.tech AI
Απάντηση από 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, это уже отрендеренное или дубликат — игнорируем
}
Такой подход гарантирует, что сообщения будут отображаться строго по порядку, а новые сообщения, пришедшие раньше времени, будут отложены до появления всех предыдущих.