.unsubscribe与.take(1)

时间:2016-11-12 12:59:09

标签: rxjs observable rxjs5

我想知道,如果在订阅后立即使用.take(1)时使用.unsubscribeunsubscribe之间的性能有任何差异:

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);
});

它的任何想法都会对性能有所不同吗?

2 个答案:

答案 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