当前位置: 首页 > 知识库问答 >
问题:

之间的区别。取消订阅。拍(1)

祁增
2023-03-14

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

var observable = Rx.Observable.interval(100);

第一:

var subscription = observable.subscribe(function(value) {
   console.log(value);
}).unsubscribe();

第二:

js prettyprint-override">var subscription = observable.take(1).subscribe(function(value) {
    console.log(value);
});

对它有什么想法会让性能有所不同吗?

共有2个答案

赵英范
2023-03-14

请记住,当组件被破坏时,take(1)仍然不会取消订阅。无论组件是活动的还是被破坏的,订阅都保持活动状态,直到发出第一个值。所以如果我们在订阅中做一些更疯狂的事情,比如访问DOM — 我们可能会在控制台中出现错误。

https://medium.com/angular-in-depth/the-best-way-to-unsubscribe-rxjs-observable-in-the-angular-applications-d8f9aa42f6a0

黄昊
2023-03-14

每个人都有不同的目的,所以很难比较它们。

一般来说,如果你采取这个来源:

const source = range(1,3);

…并使用subscribe()紧接着unsubscribe(

source.subscribe(
  console.log,
  undefined, 
  () => console.log('complete')
).unsubscribe();

…那么,即使我们在订阅后立即调用了<code>unsubscribe()</code>,也会发出<code>source</code〕中的所有值。这是因为代码仍然是严格顺序的(同步的),而源代码是一个冷可观测的。

1
2
3
complete

顺便说一句,尝试添加<code>delay(0)</code>运算符,使<code>source.pipe(delay(1)).subscribe(…).unsubscribe)</code>。这使得使用实际的<code>setTimeout()</cod>调用来异步发送值,因此,在任何<code>下一个</code>处理程序之前调用<code>unsubscribe。

换句话说,< code>unsubscribe()可以让您随时停止接收值。即使源没有发出任何值(我们也不会收到任何完整的通知)。

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

source.pipe(
  take(1),
)
.subscribe(
  console.log,
  undefined,
  () => console.log('complete')
);

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

1
complete

即使您添加了. un✘(),结果也是一样的。

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

因此,tak()是一个运算符,而un✘()Subscription对象上的一个方法。这两件事通常可以互换,但它们永远不会完全相互替代。

2019年1月:RxJS 6更新

 类似资料:
  • 假设我不使用异步管道。我想订阅component.ts文件中的一些内容。正如你所知,如果不是http请求,我应该取消订阅。 这是我试过的。 方法1)在那里实现破坏钩子和退订 方式2)订阅时,使用take(1)。take(1)将自行处理取消订阅。 我的问题是-为什么会有人选择方式1,当我们想退订时应该使用哪种方式(如果我们不需要异步管道)

  • 问题内容: 我试图破译以下功能: 我从http://blog.danlew.net/2014/09/15/grokking-rxjava- part-1/ 获得了一个很好的rxjava简介,但是它只是顺便提到了Observer,说您将在大多数情况下使用Subscriber从Observable发射到消费项目的时间。 有人可以向我解释 什么是观察者? 观察者与订户有何不同? 上面的代码段是做什么的?

  • 我使用SockJS和StompJS,当我在浏览器中打开我的应用程序时,有时它会在连接到websocket之前尝试订阅一些主题。我希望主题订阅等待应用程序连接到websocket。 这就是我实现此代码的原因,我将其称为: 因此,我只在连接状态为时才订阅该主题,并且只有在客户端首次成功连接时才会调用该主题。 我想稍后从主题中取消订阅,所以我需要内部订阅返回的对象,我还需要内部订阅的消息。 我所实现的很

  • 我试图理解延迟和延迟订阅操作符之间的区别。 本文件描述了延迟操作员: 延迟操作符通过在发出每个源可观察项之前暂停特定的时间增量(您指定)来修改其源可观察项。这会将可观测项发出的整个项目序列在时间上向前移动指定的增量 delaySubscription是这样描述的: 还有一个操作符,您可以使用它延迟对源可观察对象的订阅:delaySubscription。 然而,当我测试这两个操作员的行为时,我觉得

  • 我通读了RxJS文档,并希望确保我理解了< code > subscriber . unsubscribe()和< code > subscriber . complete()之间的区别。 假设我有一个有两个订阅者的可观察对象,订阅者1和订阅者2。如果订阅者1对其订阅调用取消订阅,它将不再接收来自可观察对象的通知,但订阅者2将继续接收它们。 <代码>的文档。complete(): 观察者回调,用于

  • 此解析器工作正常: 订阅解析器和查询解析器使用完全相同的代码有意义吗?即: 如果没有,需要什么区别?提前感谢大家提供的任何信息。

  • 一个OBLOQ最多同时订阅5个topic,可以对已经订阅的topic进行取消订阅。 请求方式: "|4|1|6|topic|\r" 参数: topic 取消订阅的topic,获取设备topic可参考教程 返回值: "|4|1|6|1|\r" 取消订阅成功 "|4|1|6|2|2|\r"取消订阅失败 "|4|1|6|2|1|\r" topic不存在,取消订阅失败 Arduino样例: softSer

  • 我正在使用静态编程语言反应器(Mono和Flux),我想知道使用(来自kotlin-coroutines-reactive)函数和(来自React)之间的区别。我带来了两个例子来展示我正在努力做的事情。 示例1(具有等待功能): 输出:带有IllegalStateException堆栈跟踪的“错误”。 示例2(具有订阅功能): 输出:只是“错误”。 为什么示例1显示堆栈跟踪而示例2不显示? 谢谢