这个RxJS示例中的switch语句有什么作用?

won*_*rld 2 switch-statement rxjs5

我不明白以下文档在此RxJS示例中的含义.有人可以回答吗?

结果是switched本质上是一个在每次点击时重新启动的计时器.旧点击的间隔Observables不会与当前间隔Observable合并.

这是代码:

var clicks = Rx.Observable.fromEvent(document, 'click');
// Each click event is mapped to an Observable that ticks every second
var higherOrder = clicks.map((ev) => Rx.Observable.interval(1000));
var switched = higherOrder.switch();
// The outcome is that `switched` is essentially a timer that restarts
// on every click. The interval Observables from older clicks do not merge
// with the current interval Observable.
switched.subscribe(x => console.log(x));
Run Code Online (Sandbox Code Playgroud)

Dav*_*oll 7

最容易理解开关的模型是autocomplete.

在典型的自动完成方案中,您将从用户获取输入,并调用返回承诺的服务.然后,您可以通过.then()更新UI来附加承诺.

function onChange(text: string) {
    this.request(url).then((data) => this.updateListBox(data))
}
Run Code Online (Sandbox Code Playgroud)

如果用户多次输入文本,您onChange每次都会调用.此时的回复顺序未得到保证.您正在调用的端点可以很好地将您的响应无序返回. 1,3,2.因此,用户将看到他们做出的第二个请求,而不是他们做出的最后一个请求.

现在,切换所做的是一个输入可观察的,它只会主动监听发送给它的最后一个observable.例如...

this.onChange
   .map(text => Observable.fromPromise(this.request(text))
   .switch()
   .subscribe((data) => this.updateListBox(data));
Run Code Online (Sandbox Code Playgroud)

每次进入价值时,onChange我们仍会按正常情况提出请求.一旦第二值从发射onChange我们unsubscribe从第一观察到的(请求1).并订阅第二个observable(请求2).

因此,一旦更新UI,您就只能使用您关心的最新数据集进行更新.

  • 在问题中的例子就是这样,每次点击`document`时都会创建一个新的计时器(从'0开始).旧的也会自动处理掉. (2认同)