首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >交换机操作员如何取消先前的可观测值?

交换机操作员如何取消先前的可观测值?
EN

Stack Overflow用户
提问于 2019-03-23 05:06:12
回答 1查看 180关注 0票数 3

我在试着理解可观察性。当我使用交换机运算符时,我无法理解“它取消了以前可观测到的和新的一条”这句话。

代码语言:javascript
运行
复制
var inp=document.getElementById("i");
var t=Rx.Observable.fromEvent(inp,"keyup");
t.map((e)=>Rx.Observable.range(1,3)).subscribe((e)=>console.log(e))
///t.map((e)=>Rx.Observable.range(1,3)).switch().subscribe((e)=>console.log(e))

每当我按下输入框中的任何键时,我都会得到这个输出,而没有开关操作符:

代码语言:javascript
运行
复制
RangeObservable {start: 1, rangeCount: 3, scheduler: CurrentThreadScheduler}
rangeCount: 3
scheduler: CurrentThreadScheduler {}
start: 1
__proto__: ObservableBase

但是当我在map操作符之后使用开关操作符时,输出就变成了1,2,3。交换机操作员内部在做什么?

EN

Stack Overflow用户

回答已采纳

发布于 2019-03-23 05:30:58

当您执行t.map((e)=>Rx.Observable.range(1,3))时,t本身是可以从输入事件中观察到的,从那里您可以将其映射到嵌套可观测的可观测值,该嵌套可观测值将从1发出整数到3。

现在将switch算子应用到它上,它本质上是对一个可观测的可观测的。在您的例子中,t.map(..)是通过调用内部的Rx.Observable.range(1,3)来创建一个可以观察到的内部的。

因此,一旦从Rx.Observable.range(1,3)发出可观测到的信号,交换机操作员就会从t.map(...)调用中取消可观测的订阅,并订阅最新的可观察的Rx.Observable.range(1,3)调用。

根据文档switch操作符,请注意单词最新的

开关订阅可观测到的发射可观测的。每次它观察到其中一个发出的可观测值时,从先前发出的可观测到的开关无订阅返回的可观测值开始从最新的可观测到的中发射项目。

要将代码更改为不使用switch,您需要订阅从t.map(...)调用中可以观察到的嵌套代码:

代码语言:javascript
运行
复制
t.map((e)=>Rx.Observable.range(1,3)).subscribe((e)=> e.subscribe(e => console.log(e)))

它将在控制台中输出1, 2, 3。因此,switch使它更优雅,而不是订阅嵌套的可观察到的,您只需一发出就切换到它。

代码语言:javascript
运行
复制
t.map((e)=>Rx.Observable.range(1,3)).switch().subscribe((e)=>console.log(e))
                       //  ^
                       //  |_________________ now this Observable is subscribed as soon as it is emitted.

下面是一个演示,演示如何订阅内部可观察到的不需要switch的1、2、3

代码语言:javascript
运行
复制
var inp=document.getElementById("input");
var t=Rx.Observable.fromEvent(inp,"keyup");
console.log("** Without Switch ***")
t.map((e)=>Rx.Observable.range(1,3)).subscribe((e)=> e.subscribe(e => console.log(e)));
代码语言:javascript
运行
复制
<script src="https://npmcdn.com/@reactivex/rxjs@5.0.0-beta.6/dist/global/Rx.umd.js"></script>
Enter something: <input type="text" id='input'>

switch也是如此

代码语言:javascript
运行
复制
var inp=document.getElementById("input");
var t=Rx.Observable.fromEvent(inp,"keyup");
console.log("** With Switch ***")
t.map((e)=>Rx.Observable.range(1,3)).switch().subscribe(e=> console.log(e));
代码语言:javascript
运行
复制
<script src="https://npmcdn.com/@reactivex/rxjs@5.0.0-beta.6/dist/global/Rx.umd.js"></script>
Enter something: <input type="text" id='input'>

票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55310798

复制
相关文章

相似问题

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