Перейти к содержанию

Создание операторов

Имеющихся в RxJS "встроенных" операторов практически всегда будет достаточно, за исключением редких и весьма специфических случаев. Вот тогда вам и придется создавать свой собственный оператор.

Разберем пример создания оператора, который принимает n-ое значение от объекта Observable и завершает его выполнение.

const takeNth = (n: number) => <T>(source: Observable<T>) =>
  new Observable<T>(observer => {
    let current = 1

    return source.subscribe(
      vl => {
        if (current++ === n) {
          observer.next(vl)
          observer.complete()
        }
      },
      err => observer.error(err),
      () => observer.complete()
    )
  })

from(['Jack', 'Jane', 'Jim', 'Jason'])
  .pipe(takeNth(3))
  .subscribe(vl => console.log(vl), err => {}, () => console.log('Completed'))

Подробное описание оператора from().

Также создавать операторы можно используя уже существующие.

const takeNth = (n: number) => <T>(source: Observable<T>) => source.pipe(filter((value, index) => index === n - 1))

from(['Jack', 'Jane', 'Jim', 'Jason'])
  .pipe(takeNth(3))
  .subscribe(vl => console.log(vl), err => {}, () => console.log('Completed'))