我想知道,如果在订阅后立即使用.take(1)
时使用.unsubscribe
和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);
});
它的任何想法都会对性能有所不同吗?
答案 0 :(得分:81)
每个都有不同的用途,因此很难对它们进行比较。
一般来说,如果你采用这个来源:
const source = range(1,3);
...并使用subscribe()
消费它,然后立即使用unsubscribe()
:
source.subscribe(
console.log,
undefined,
() => console.log('complete')
).unsubscribe();
...即使我们在订阅后立即调用source
,也会发出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
答案 1 :(得分:3)
请记住, take(1)仍然不会在退订时 组件被破坏。订阅保持活动状态,直到 无论组件处于活动状态还是销毁状态,都会发出第一个值。 因此,如果我们在我们的网站上做一些更疯狂的事情,例如访问DOM, subscription-我们可能最终在控制台中出现错误。 https://blog.angularindepth.com/the-best-way-to-unsubscribe-rxjs-observable-in-the-angular-applications-d8f9aa42f6a0