我想知道,在使用 unsubscribe
后,使用 .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);
});
它的任何想法会对性能产生不同的影响吗?
最佳答案
每个都有不同的用途,因此很难对它们进行比较。
一般来说,如果您采用此来源:
const source = range(1,3);
...并使用 subscribe()
使用它,然后立即使用 unsubscribe()
:
source.subscribe(
console.log,
undefined,
() => console.log('complete')
).unsubscribe();
...那么即使我们在订阅后立即调用 unsubscribe()
,来自 source
的所有值都将被发出。这是因为代码仍然是严格顺序(同步)的,并且源
是一个冷Observable。
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 进行了更新
关于rxjs - .unsubscribe 和 .take(1) 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40563065/