rxjs - .unsubscribe 和 .take(1) 之间的区别

标签 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.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/

相关文章:

javascript - throttleTime 运算符的配置参数如何工作? ( throttle 配置)

angular - Angular 6 中的 Observable<string> 类型上不存在属性 'publish'

Angular 4 - Http 请求错误 : You provided 'undefined' where a stream was expected

angular 2可观察超时第二个参数类型

angular - 为什么在共享服务中使用 BehaviorSubject 而不是使用简单的共享变量?

javascript - Observable 最后订阅

angular - 如果可观察未完成,则共享订阅

redux - rxjs 触发并行请求,并等待其中一个请求完成并更新

android - 将 zip() 与可能不会发出值的 Maybe 一起使用