Я нашел takeUntil() полезным в тестах, чтобы убедиться, что потоки завершены, чтобы разные тесты не мешали друг другу.

Например, если у вас есть потоки, прослушивающие глобальные события (например, события клавиатуры), довольно легко случайно написать тесты, чтобы потоки из предыдущих тестов все еще были активны.

Без takeUntil() следующий набор тестов завершится ошибкой. Тест «урожайность B» завершится ошибкой, потому что подписчик в тесте «урожайность A» все еще прослушивает события keyup.

const stopTest$ = new Rx.Subject();
afterEach(() => {
  stopTest$.next();
});
const uppercaseKey = () => {
  return Rx.Observable.fromEvent(document, 'keyup')
    .pluck('key')
    .map(key => key.toUpperCase())
};

it('yields A', (done) => {
  uppercaseKey()
    .do(value => expect(value).toBe('A'))
    .takeUntil(stopTest$)
    .subscribe(done, done.fail);
  document.dispatchEvent(new KeyboardEvent('keyup', { key: 'a' }));
});

it('yields B', (done) => {
  uppercaseKey()
    .do(value => expect(value).toBe('B'))
    .takeUntil(stopTest$)
    .subscribe(done, done.fail);
  document.dispatchEvent(new KeyboardEvent('keyup', { key: 'b' }));
});