我想知道在订阅之后立即使用.take(1)和.unsubscribe在性能上有什么不同:
var observable = Rx.Observable.interval(100);首先:
var subscription = observable.subscribe(function(value) {
console.log(value);
}).unsubscribe();第二:
var subscription = observable.take(1).subscribe(function(value) {
console.log(value);
});对于性能有什么不同的想法吗?
发布于 2016-11-12 23:24:20
每种方法都有不同的用途,所以很难对它们进行比较。
一般来说,如果你使用这个源码:
const source = range(1,3);..。并通过紧随其后的unsubscribe()和subscribe()使用它
source.subscribe(
console.log,
undefined,
() => console.log('complete')
).unsubscribe();..。那么所有来自source的值都将被发送,即使我们在订阅之后立即调用了unsubscribe()。这是因为代码仍然是严格连续(同步)的,而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进行更新
发布于 2019-06-20 14:37:44
只需记住,当组件被销毁时,take(1)仍然不会取消订阅。无论组件是活动的还是已销毁的,订阅都将保持活动状态,直到发出第一个值。因此,如果我们在订阅 - 中做一些更疯狂的事情,比如访问DOM,我们可能会在控制台中得到一个错误。https://medium.com/angular-in-depth/the-best-way-to-unsubscribe-rxjs-observable-in-the-angular-applications-d8f9aa42f6a0
https://stackoverflow.com/questions/40563065
复制相似问题