演示: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')
);
帮助我了解其背后的原因
正如您在问题标题中提到的,第一个示例是同步的,因此您在.subscribe()
方法内部仍可获取第一个值。自然,应该具有observer
对象的Subscription
尚未初始化。
如果您希望在收到单个值后退订,我建议使用.take(1)