Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/458.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
Javascript 交换机操作员如何取消订阅以前的观测值?_Javascript_Asynchronous_Rxjs_Reactive Programming - Fatal编程技术网

Javascript 交换机操作员如何取消订阅以前的观测值?

Javascript 交换机操作员如何取消订阅以前的观测值?,javascript,asynchronous,rxjs,reactive-programming,Javascript,Asynchronous,Rxjs,Reactive Programming,我试图理解可观察的事物。 当我使用switch操作符时,我无法理解“它取消订阅以前的可观察到的,而订阅新的”这一行 每当我按下输入框中的任何键时,我在没有开关操作器的情况下获得此输出: RangeObservable {start: 1, rangeCount: 3, scheduler: CurrentThreadScheduler} rangeCount: 3 scheduler: CurrentThreadScheduler {} start: 1 __proto__: Observabl

我试图理解可观察的事物。 当我使用switch操作符时,我无法理解“它取消订阅以前的可观察到的,而订阅新的”这一行

每当我按下输入框中的任何键时,我在没有开关操作器的情况下获得此输出:

RangeObservable {start: 1, rangeCount: 3, scheduler: CurrentThreadScheduler}
rangeCount: 3
scheduler: CurrentThreadScheduler {}
start: 1
__proto__: ObservableBase
但是,当我在map操作符之后使用switch操作符时,输出变为
1,2,3

开关操作符在内部做什么?

当你在做
t.map((e)=>Rx.Observable.range(1,3))
时,
t
本身是输入事件的可观察对象,从那里你将它映射到嵌套可观察对象的可观察对象,它将发出1到3的整数

现在,您在其上应用
开关
操作符,它本质上作用于可观察的对象的可观察对象。在您的例子中,
t.map(…)
正在通过调用内部的
Rx.Observable.range(1,3)
来创建内部可观察对象的可观察对象

因此,一旦从
Rx.Observable.range(1,3)
发出一个Observable,交换机操作员将取消订阅
t.map(…)
调用中的Observable,并订阅
Rx.Observable.range(1,3)
调用中的最新Observable

根据
开关
操作员的指示,请注意单词最新

开关订阅一个发出可见光的可见光。每次 它观察其中一个发射的可见光,可见光返回 by Switch取消订阅先前发出的可观测数据 从最新的可观察到的发射项目

要将代码更改为不使用
开关
,您需要从
t.map(…)
调用中订阅嵌套的Observable:

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.
下面是一个演示,演示如何订阅内部Observable,在不使用
开关的情况下获得1、2、3:

var inp=document.getElementById(“输入”);
var t=从事件(inp,“键控”)可观察到的Rx;
console.log(“**不带开关***”)
t、 map((e)=>Rx.Observable.range(1,3)).subscribe((e)=>e.subscribe(e=>console.log(e))


输入一些内容:
这是我无法可视化…observable of observable并取消订阅上一个并订阅最新的。开关返回的observable将取消订阅以前发出的observable。这些语句没有得到清除o
t.map((e)=>Rx.observable.range(1,3))
调用是一个带有嵌套可观察对象的可观察对象,现在如果您直接订阅它,您将得到一个包含另一个可观察对象的可观察对象,如您的输出所示,但您不希望这样,您希望
1、2、3
,因此您需要订阅嵌套可观察对象以获得该输出。所以开关使它变得容易。不再订阅,只需切换到嵌套的Observable并订阅,然后从父Observable取消订阅。谢谢,我明白了。这是否意味着开关操作符将只处理嵌套的可观察对象,并且每个操作符在每次源可观察对象发出值时都创建中间可观察对象?是的
开关
以这种方式工作,但不是每个操作符都会创建中间可观察对象。在您的示例中,通过映射到嵌套的可观察对象,可以显式地实现这一点。如果没有
Rx.Observable.range(1,3)
,您只需将键盘事件包装在一个Observable.range中即可。如果有帮助,请不要忘记接受我的回答!
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.