每个都有不同的目的,因此很难进行比较。
通常,如果您使用此来源:
const source = range(1,3);
...并subscribe()
立即使用unsubscribe()
:
source.subscribe(
console.log,
undefined,
() => console.log('complete')
).unsubscribe();
...那么source
即使我们unsubscribe()
在订阅后立即调用,也将发出from中的所有值。这是因为代码仍然严格地是顺序的(同步的),并且source
是可观察的。
1
2
3
complete
顺便说一句,尝试添加delay(0)
操作符使source.pipe(delay(0)).subscribe(...).unsubscribe()
。这使得使用实际setTimeout()
调用异步发出值,因此unsubscribe()
在任何next
处理程序之前都会调用该值,并立即将其丢弃。
换句话说,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();
如果在Javascrit完成这一行之后将调用函数A,则将无法按预期工作。因此,如果只获得一个值,那么您将获得零值。建议手动订阅并使用take(..)或其他类似take的订阅方法。