#rxjs
#rxjs
Вопрос:
Я создаю страницу, которая отображает пользователю кучу документов pdf. В настоящее время я использую оператор repeat из библиотеки ‘rxjs / operators’, чтобы принудительно обновить страницу документов.
My code is below
import { map, repeat } from 'rxjs/operators';
...
// Fetch Document type Filter.
this.firebaseService
.documentAdminAccessList()
.snapshotChanges()
.pipe(
map(changes => changes.map(c => ({ value: c.payload.val() }))),
repeat(5)
Однако иногда происходит так, что ссылка на страницу документов не появляется вовремя. Я боюсь, что повторение (5) выполняется слишком быстро. Как я могу добавить задержку в 500 миллисендов между каждой повторной операцией?
Обновление (14 января 2021 г.), я все еще вижу эту проблему. Ссылка на документы в строке меню по-прежнему задерживается; только после загрузки начальной навигационной панели.
Ниже приведен мой код: Rafi. Может ли ‘take’ быть неправильным?
// Fetch Document type Filter.
this.firebaseService
.documentAdminAccessList()
.snapshotChanges()
.pipe(
map(changes => changes.map(c => ({ value: c.payload.val() }))),
repeatWhen(x=> x.pipe(delay(250), take(5)))
)
Ответ №1:
Повторите, когда
Возвращает наблюдаемое, которое отражает исходное наблюдаемое, за исключением полного. Если исходные наблюдаемые вызовы завершены, этот метод будет отправлен наблюдаемому, возвращенному из уведомителя. Если это наблюдаемое вызывает complete или error , то этот метод вызовет complete или error для дочерней подписки. В противном случае этот метод будет повторно подписываться на исходный наблюдаемый объект, он возвращает наблюдаемый объект, который отражает исходный наблюдаемый объект, за исключением complete . (Документы Rxjs)
Рассмотрите возможность его использования в сочетании с delay
operator, чтобы при завершении исходного наблюдаемого наблюдаемый, возвращаемый методом repeatWhen
, которому был передан (который может быть исходным наблюдаемым, которому он был предоставлен), повторно подписывался (с задержкой в X мс между попытками), в результате чего исходный наблюдаемый повторно подписывался каждый раз, когда он выдает(Наблюдаемое repeatWhen
было предоставлено), как показано ниже:
repeatWhen(x=> x.pipe(delay(5000)))
Глядя на ваш вопрос, кажется, что вы хотите ограничить количество повторений, этого можно легко достичь с помощью take(5)
operator, как показано ниже:
of(SOME_VALUE)
.pipe(
repeatWhen(x => x.pipe(delay(500), take(5)))
)
.subscribe(x => {
console.log(x)
})
Комментарии:
1. Привет, Рафи, в итоге я поставил .pipe( map(changes => changes.map(c => ({ value: c.payload.val() }))), repeat(5), delay(250), но я не думаю, что это работает. Есть еще идеи?
2. Вы пробовали решение, предложенное выше?
3. Отлично. Ваше предложение работает, Рафи 🙂
4. Добро пожаловать в SO!. Если приведенный выше ответ устранил вашу проблему, вы должны принять его (установите флажок рядом с соответствующим ответом). Это делает две вещи. Это позволяет всем знать, что ваша проблема решена, и дает человеку, который помогает вам, кредит за помощь. Смотрите Здесь для полного объяснения
5. Готово. Спасибо. Я ценю помощь.