同步RxJ取消订阅不起作用

问题描述 投票:0回答:1

演示:https://stackblitz.com/edit/rxjs-unsubscribe-issue?file=index.ts

以下代码不起作用

错误:无法读取未定义的属性'unsubscribe'

    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')
    );

帮助我了解其背后的原因

rxjs observable subscription rxjs6 rxjs-observables
1个回答
0
投票

正如您在问题标题中提到的,第一个示例是同步的,因此您在.subscribe()方法内部仍可获取第一个值。自然,应该具有observer对象的Subscription尚未初始化。

如果您希望在收到单个值后退订,我建议使用.take(1)

© www.soinside.com 2019 - 2024. All rights reserved.