Как добавить задержку между повторяющимися операциями в rxjs

#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. Готово. Спасибо. Я ценю помощь.