首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.unsubscribe与.take的区别(1)

.unsubscribe与.take的区别(1)
EN

Stack Overflow用户
提问于 2016-11-12 20:59:09
回答 2查看 44.7K关注 0票数 92

我想知道在订阅之后立即使用.take(1).unsubscribe在性能上有什么不同:

代码语言:javascript
复制
var observable = Rx.Observable.interval(100);

首先:

代码语言:javascript
复制
var subscription = observable.subscribe(function(value) {
   console.log(value);
}).unsubscribe();

第二:

代码语言:javascript
复制
var subscription = observable.take(1).subscribe(function(value) {
    console.log(value);
});

对于性能有什么不同的想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-12 23:24:20

每种方法都有不同的用途,所以很难对它们进行比较。

一般来说,如果你使用这个源码:

代码语言:javascript
复制
const source = range(1,3);

..。并通过紧随其后的unsubscribe()subscribe()使用它

代码语言:javascript
复制
source.subscribe(
  console.log,
  undefined, 
  () => console.log('complete')
).unsubscribe();

..。那么所有来自source的值都将被发送,即使我们在订阅之后立即调用了unsubscribe()。这是因为代码仍然是严格连续(同步)的,而source是一个冷可观察对象。

代码语言:javascript
复制
1
2
3
complete

顺便说一句,尝试添加delay(0)运算符来制作source.pipe(delay(0)).subscribe(...).unsubscribe()。这使得使用实际的setTimeout()调用来发送值是异步的,因此unsubscribe()在任何next处理程序之前被调用,并被立即丢弃。

换句话说,unsubscribe()可以让你随时停止接收值。即使源没有发出任何值(我们从未收到任何完整的通知)。

使用take()运算符将链限制为仅发出特定数量的值。

代码语言:javascript
复制
source.pipe(
  take(1),
)
.subscribe(
  console.log,
  undefined,
  () => console.log('complete')
);

这只会发出一个值并完成:

代码语言:javascript
复制
1
complete

即使添加.unsubscribe(),结果也是一样的。

查看现场演示:https://stackblitz.com/edit/rxjs-tbu5kb

所以take()是一个运算符,而unsubscribe()Subscription对象上的一个方法。这两个东西通常是可以互换的,但它们永远不会完全相互替代。

2019年1月:针对RxJS 6进行更新

票数 146
EN

Stack Overflow用户

发布于 2019-06-20 14:37:44

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

票数 47
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40563065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档