RxJS - излучать, только если другие не излучают во время задержки - PullRequest
0 голосов
/ 23 декабря 2018

Предположим, у меня есть две наблюдаемые.Каждый раз, когда выходит первый, я хочу подождать 2 секунды, чтобы увидеть, издает ли что-то другое наблюдаемое в этот период.Если да, не излучайте ничего.Если нет, выбрасывайте.

Пример:

const start$ = this.events.pipe(
  delay(1000),
  takeUntil(theSecondObservable) // WHAT SHOULD BE HERE?
).subscribe((value) => {
  console.log(value);
});

Ответы [ 3 ]

0 голосов
/ 24 декабря 2018

Интересно ли вам ограничить выбросы от 1-го наблюдателя или только в конечном результате?

Вы можете использовать расу ...

let r = race(observer1.pipe(delay(2000)), observer2)
 // r will emmit from observer1 only if observer2 didnt emmit, else it will emmit from observer2
0 голосов
/ 27 декабря 2018

Мне удалось решить это с помощью ответов выше.Тем не менее, они не полностью ответили на мой вопрос, и, возможно, есть лучший способ.Мое решение:

const end$ = this.router.events.pipe(
  map(() => false),
);
const start$ = this.router.events.pipe(
  map(() => true),
);

merge(
  end$,
  start$.pipe(
    switchMap(() => {
      return race(end$, of(true).pipe(delay(2000)));
    }),
    filter((value) => value === true) // this really works only with booleans, not sure how I'd do it with more 
                                                            // complex objects
  )
).subscribe((value) => {
  console.log(value);
});
0 голосов
/ 24 декабря 2018

Используйте оператора гонки .

const start$ = race(this.events.pipe(delay(1000)), theSecondObservable).subscribe(value => /** ... */);

Как только одна из наблюдаемых испускает объект, другая наблюдаемая будет игнорироваться, и подписчику будут переданы только значения, испущенные «победителем».В вашей функции подписки вы можете выполнить некоторую логику, чтобы выяснить, из какого значения произошла ваша ценность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...