Синхронная отсылка Rx Js не работает - PullRequest
0 голосов
/ 12 февраля 2020

Демонстрация: https://stackblitz.com/edit/rxjs-unsubscribe-issue?file=index.ts

Код ниже не работает

Ошибка: невозможно прочитать свойство «отписаться» от неопределенного

    const a = (): Observable<any> =>
    new Observable(sub => {
      sub.next(1);
      return () => {
        console.log('unsubscribe');
      };
    });
    const observer = a().subscribe(
      value => {
        console.log('Subscription');
        observer.unsubscribe();
      },
      e => console.log(e),
      () => console.log('complete')
    );

Но работает следующий код

    const b = (): Observable<any> =>
    new Observable(sub => {
      setTimeout(()=>sub.next(1),0);
      return () => {
        console.log('unsubscribe');
      };
    });
    const observer2 = b().subscribe(
      value => {
        console.log('Subscription b');
        observer2.unsubscribe();
      },
      e => console.log(e),
      () => console.log('complete')
    );

Помогите мне понять причину этого

1 Ответ

0 голосов
/ 12 февраля 2020

, как вы упомянули в заголовке вашего вопроса, первый пример является синхронным, поэтому вы получаете первое значение, оставаясь внутри метода .subscribe(). Естественно, observer, который должен иметь объект Subscription, еще не был инициализирован.

Если вы хотите отписаться после получения одного значения, я бы предложил использовать .take(1)

...