У меня есть следующий код, чтобы получить последние CHAST сообщения:Firebase отложенной загрузки с rxjs
const pageSize = 10;
this.notifier = new Subject<any>();
let last: Observable<any>;
let infiniteList = Observable
// Use zip to combine the notifier's emissions with the last
// child value:
.zip(this.notifier, Observable.defer(() => last))
// Use concatMap to emit a page of children into the
// composed observable (note that first is used to complete
// the inner list):
.concatMap(([unused, last]) => this.af.database.list("chat_messages", {
query: {
// If there is a last value, start at that value but ask
// for one more:
limitToLast: last ? (pageSize + 1) : pageSize
}
})
.first()
)
// Use scan to accumulate the page into the infinite list:
.scan((acc, list) => {
// If this isn't the initial page, the page was started
// at the last value, so remove it from the beginning of
// the list:
if (acc.length > 0) {
list.shift();
}
return acc.concat(list);
}, [])
// Use share so that the last observable (see below) doesn't
// result in a second subscription:
.share();
// Each time a page is emitted, map to its last child value so
// that it can be fed back into the composed infinite list:
last = infiniteList
.map((list) => {
list.reverse();
if (list.length === 0) {
return null;
}
return list[list.length - 1].date_published;
})
.startWith(null);
infiniteList.subscribe((list) => {
this.chatMessages = list;
});
this.notifier.next();
Всякий раз, когда пользователь прокручивает в нижней части списка я this.notifier.next();
, чтобы узнать больше из истории чата. 10 сообщений за раз.
Проблема: первые 10 работ великолепны, но когда я прокручиваю нижнюю часть, чтобы читать новые данные, я получаю ту же информацию в обратном порядке. Например, у меня было так:
1- Хорошо
2- хорошо, вы?
10- Привет alL! Как дела?
--- прокрутки к предыдущему 10 message--
12-. Всем привет! Как дела?
13-. Отлично, ты?
14-. Хорошее
После обновления кода (который, кажется, больше прав), при переходе к нижней части списка и с помощью 'следующий()' он снова показывает те же сообщения чата – TheUnreal
Я обновил ответ. Вам нужно скопировать список до того, как он будет отменен - как разворот на месте. – cartant
Тот же вывод, что и в начале, показывает те же сообщения при использовании 'emit.next()', только в обратном порядке, вместо старых сообщений – TheUnreal