每个工具都有其不同的用途,因此很难进行比较。
一般来说,如果您使用此源:
const source = range(1,3);
使用 subscribe()
订阅并立即使用 unsubscribe()
取消订阅:
source.subscribe(
console.log,
undefined,
() => console.log('complete')
).unsubscribe();
即使我们在订阅后立即调用unsubscribe()
,如果代码仍然是严格顺序(同步)的且source
是冷Observable,则所有来自source
的值都会被发出。
1
2
3
complete
另外,尝试添加delay(0)
操作符以使source.pipe(delay(0)).subscribe(...).unsubscribe()
中的值发射变为异步,使用真实的setTimeout()
调用。因此,在任何next
处理程序之前,调用unsubscribe()
并立即丢弃它。
换句话说,unsubscribe()
可以让您随时停止接收值。即使源未发出任何值(我们永远不会收到任何完成通知)。
使用take()
操作符限制链只发出特定数量的值。
source.pipe(
take(1),
)
.subscribe(
console.log,
undefined,
() => console.log('complete')
);
这只会发出单个值并完成:
1
complete
即使添加了
.unsubscribe()
,结果仍然相同。查看现场演示:
https://stackblitz.com/edit/rxjs-tbu5kb。因此,
take()
是一个操作符,而
unsubscribe()
是
Subscription
对象上的方法。这两个东西通常可以互换,但它们永远无法完全替代彼此。更新日期:2019年1月,适用于RxJS 6。
var subscription = observable.subscribe({function A}).unsubscribe();
不会按预期工作。因此,你将得到零值而不是一个值。建议手动订阅并使用take(..)
或其他像take
这样处理订阅的方法。 - Stav Alfi