Skip to content

Instantly share code, notes, and snippets.

@ThomasBurleson
Last active January 11, 2019 14:04
Show Gist options
  • Save ThomasBurleson/b39185f330a75ebe869ed862b3e10f19 to your computer and use it in GitHub Desktop.
Save ThomasBurleson/b39185f330a75ebe869ed862b3e10f19 to your computer and use it in GitHub Desktop.
Using custom RxJS log() operator
export function log(task: string) {
const announceCompleted = () => {
console.log(`${task} %ccomplete`, 'color: green');
};
return function<T>(source: Observable<T>) {
return source.pipe(
tap(
console.log,
console.error,
announceCompleted
)
);
};
}
@ThomasBurleson
Copy link
Author

ThomasBurleson commented Jan 11, 2019

Usage

const source = interval(1000).pipe(
  delay(750),
  takeUntil(fromEvent(document,'click')),
  log('Interval Countdown'),
  map(x => `Hello ${x}!`),
);

See:

@ThomasBurleson
Copy link
Author

ThomasBurleson commented Jan 11, 2019

Can also use long form:

export function log() {
  return function logFn<T>(source: Observable<T>) {
    const output = new Observable<T>(observer => {
      const subscription = source.subscribe(
        (val:T) => {
          console.log(val);
          observer.next(val);
        },
        (err) => {
          console.error(err);
          observer.error(err);
        },
        () => {
          console.log('%ccomplete', 'color: green');
          observer.complete();
        }
      );
      return () => {
        subscription.unsubscribe();
      };
    });

    return output;
  };
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment