RXJS принимает 1, если синхронный, иначе использовать defaultValue - PullRequest
0 голосов
/ 07 июня 2019

Я знаю, что activatedRoute на самом деле BehaviourSubject, но, поскольку его открытый API можно наблюдать, я не хочу рисковать.

activatedRoute.queryParams.pipe(
    take(1),
).subscribe(query => {  // { page?: '1' | '2' | '3'... }
    this.currentPage = new BehaviourSubject(+(query.page) || 1);
    // Other components actually change this
});

console.log(this.currentPage); // I need this to not be undefined!

Существует ли канал, похожий на этот?takeSynchonously(1, { page: 1 })

1 Ответ

0 голосов
/ 07 июня 2019

Я нашел ответ, это комбинация takeUntil, timer и queueScheduler.

const { BehaviorSubject, ReplaySubject, Subject, timer, queueScheduler } = rxjs;
const { startWith, defaultIfEmpty, takeUntil, take } = rxjs.operators;

new Subject().pipe(
  take(1),
  takeUntil(timer(1, queueScheduler)),
  defaultIfEmpty(0),
).subscribe(n => console.log('Subject', n));

new ReplaySubject(1).pipe(
  take(1),
  takeUntil(timer(1, queueScheduler)),
  defaultIfEmpty(0),
).subscribe(n => console.log('ReplaySubject', n));

const rs = new ReplaySubject(1);
rs.next(1)
rs.pipe(
  take(1),
  takeUntil(timer(1, queueScheduler)),
  defaultIfEmpty(0),
).subscribe(n => console.log('ReplaySubject (with value)', n));

new BehaviorSubject(5).pipe(
  take(1),
  takeUntil(timer(1, queueScheduler)),
  defaultIfEmpty(0),
).subscribe(n => console.log('BehaviorSubject', n));

console.log('priority')
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.5.2/rxjs.umd.js"></script>

Примечание: Это должно использоваться в сочетании с ReplySubject или подобным.Все с начальным значением будет синхронным, но без него будет обработано в следующем тике.

...