我在试着理解可观察性。当我使用交换机运算符时,我无法理解“它取消了以前可观测到的和新的一条”这句话。
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))每当我按下输入框中的任何键时,我都会得到这个输出,而没有开关操作符:
RangeObservable {start: 1, rangeCount: 3, scheduler: CurrentThreadScheduler}
rangeCount: 3
scheduler: CurrentThreadScheduler {}
start: 1
__proto__: ObservableBase但是当我在map操作符之后使用开关操作符时,输出就变成了1,2,3。交换机操作员内部在做什么?
发布于 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(...)调用中可以观察到的嵌套代码:
t.map((e)=>Rx.Observable.range(1,3)).subscribe((e)=> e.subscribe(e => console.log(e)))它将在控制台中输出1, 2, 3。因此,switch使它更优雅,而不是订阅嵌套的可观察到的,您只需一发出就切换到它。
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
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)));<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也是如此
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));<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'>
https://stackoverflow.com/questions/55310798
复制相似问题