.unsubscribe与.take(1)之间的区别


72

我想知道,订阅后立即使用.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);
});

关于它的任何想法都会对性能产生不同的影响吗?


3
var subscription = observable.subscribe({function A}).unsubscribe();如果在Javascrit完成这一行之后将调用函数A,则将无法按预期工作。因此,如果只获得一个值,那么您将获得零值。建议手动订阅并使用take(..)或其他类似take的订阅方法。
Stav Alfi

Answers:


128

每个都有不同的目的,因此很难进行比较。

通常,如果您使用此来源:

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更新


49
嗨@mar​​tin take(1)取消订阅吗?如果我添加take(1),是否必须再次调用退订?谢谢
第五时

90
@第五不,你不知道。当链完成后,它会递归地调用所有处理程序处理程序,因此您无需调用unsubscribe自己。
马丁

8
第五,@ martin-您能根据这两条评论提出问题和答案吗?我实际上是在寻找这个特定的问题(“ take-1是否取消订阅?”),并且偶然地进入了这个问题。从对您的评论的异常高昂的投票来看,其他人似乎同意;)或至少以某种可见的方式将其添加到当前的问答中。取消X(或流的任何“完成”)确实取消订阅的事实确实很重要,而且我找不到任何可以触及该问题并给出明确而明确的答案的问与答,例如马丁在这里的评论。
quetzalcoatl

2
@quetzalcoatl如果您看到源代码,它将调用unsubscribe。github.com/ReactiveX/rxjs/blob/master/src/internal/operators/...
佳登捷时

请注意,如果由于任何原因它不需要一个(或任何数量的计数)就不会退订。
Farhad

29

请记住,在销毁组件时,take(1)仍不会取消订阅。订阅保持活动状态,直到发出第一个值为止,无论组件处于活动状态还是被销毁。因此,如果我们在订阅中做一些更疯狂的事情(例如访问DOM),则最终可能会导致控制台错误。 https://medium.com/angular-in-depth/the-best-way-to-unsubscribe-rxjs-observable-in-the-angular-applications-d8f9aa42f6a0


2
有用的文章。
nightElf91 '19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.