Как я мог бы сделать интервал для предметной трубы?

#angular #rxjs

Вопрос:

У меня есть эти действия:

 message$ = new Subject();
    
    method() {
        return this.message$.pipe(scan((acc, val) => [...acc, val] []))
    }
    
     method.subscribe()
 

Я хотел бы получить значение с интервалом в 1 сек., чтобы я мог контролировать получение значений с сервера.

Я был бы рад, если бы кто-нибудь показал, как это можно сделать. Спасибо.

Комментарии:

1. Вот пример, который может помочь вам достичь того же самого: learnrxjs.io/learn-rxjs/operators/transformation/scan

Ответ №1:

Вы можете использовать интервал из RxJS, который создает наблюдаемое, которое выдает последовательные числа с определенным интервалом.

подобный этому:

 obs$ = interval(1000).pipe(mapTo("Im emtting this every second"))
 

Затем вы можете подписаться на obs$, а затем получать свою стоимость каждые 1000 мс.

Обычно при работе с объектами вы не подписываетесь на них напрямую и не показываете их внешнему миру. Поскольку субъект является наблюдаемым и наблюдателем, это может все испортить.

Поэтому принято делать следующее:

 private sub = new Subject();
public const obs$ = sub.asObservable()
 

Если вы хотите кэшировать значение, вы можете вместо этого использовать объект BeaviorSubject, поэтому поздние подписчики также получат последнее значение. У вас также может быть общедоступный метод, который может вызывать next по этому вопросу.

Я не знаю, хотите ли вы отправлять запрос каждую секунду или хотите накапливать все ответы. Если вы хотите накопить ответы, вы можете использовать оператор сканирования.

Простой пример без накопления ответа выглядит примерно так:

   httpPoller(): Observable<responseDTO>{
    return interval(1000).pipe(switchMap(() => this.fetchData()));
  }


  fetchData(): Observable<responseDTO> {
    return this.http.get<responseDTO>("www.mybackend.com");
  }
 

Затем вы можете подписаться на это где-нибудь в своем коде. Не забудьте отказаться от подписки на наблюдаемое, если вы используете его в компоненте, который создается несколько раз.
Карта переключателей используется для объединения двух наблюдаемых объектов в цепочку, и она отменит выполнение внутреннего наблюдаемого объекта, если внешний выдаст значение.
Карта переключения отменит запрос, если данные не будут получены до следующего выброса. Если вы не хотите такого поведения, вы можете заменить его, например, на concatMap, который будет вызывать серверную часть для каждого выброса интервала.
Вместо этого вы также можете использовать exhaustMap. Тогда внутренняя наблюдаемая(http-запрос) будет игнорировать исходящие сигналы от внешней наблюдаемой, если это не будет сделано.