Rxjs .unsubscribe to.take之间的差异(1)
我想知道,在订阅后立即使用Rxjs .unsubscribe to.take之间的差异(1),rxjs,observable,rxjs5,Rxjs,Observable,Rxjs5,我想知道,在订阅后立即使用unsubscribe时,使用.take(1)和.unsubscribe在性能上是否有任何区别: var observable = Rx.Observable.interval(100); 第一: var subscription = observable.subscribe(function(value) { console.log(value); }).unsubscribe(); 第二: var subscription = observable.tak
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
的所有值都将被发出,即使我们在订阅之后立即调用了unsubscribe()
。这是因为代码仍然是严格顺序的(同步的),而源代码是冷可观察的
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()
,结果也是一样的
见现场演示:
因此,take()
是一个操作符,而unsubscribe()
是一个对象上的方法。这两种东西通常是可以互换的,但它们永远不会完全相互替代
2019年1月:RxJS 6更新
请记住,take(1)在
组件正在被销毁。订阅将保持活动状态,直到
无论组件处于活动状态还是已销毁,都会发出第一个值。
因此,如果我们做一些更疯狂的事情,比如访问DOM,在我们的
订阅 — 我们可能会在控制台中出现错误。
var subscription=observable.subscribe({function A}).unsubscribe()代码>将无法按预期工作,因为函数A将在javascrit执行完此行后调用。因此,不是只得到一个值,而是得到零值。建议手动订阅,并使用take(..)或其他类似take的方法为您处理订阅。hi@martin does take(1)是否取消订阅?如果我添加take(1),我是否需要再次呼叫unsubscribe?Thanks@fifth不,你没有。当链完成时,它会递归调用所有dispose处理程序,这样你就不需要自己调用unsubscribe
。第五,@martin-你能从这两条评论中提出一个问题并回答吗?我实际上是在寻找这个特定的问题(“take-1是否取消订阅?”),然后意外地进入了这个问题。从你的评论中异常高的得票率来看,其他人似乎都同意;)或者至少以某种可见的方式将其添加/插入当前问答中。take-X(或流的任何“完成”)确实取消订阅这一事实非常重要,我找不到任何能触及这一问题的问答,也找不到像martin在这里的评论那样给出明确答案的问答。@quetzalcatl如果你看到源代码,它称为取消订阅。请注意,如果出于任何原因,它不需要一个(或任何数量的计数),它不会取消订阅。有用的文章。
1
complete