Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rxjs .unsubscribe to.take之间的差异(1)_Rxjs_Observable_Rxjs5 - Fatal编程技术网

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