RxJS switchMap 和不同的可观察对象
RxJS switchMap and different observables
Angular 和 RxJS 的新手,试图稍微了解一下...我的应用程序对 UI 事件做出反应,结果调用了一个 HTTP 服务 returns 是一个 Observable。我是这样订阅的:
this.myXYZService.search(query)
.map(r => { // some code })
.subscribe(r => { //some code });
假设该事件再次触发,并导致第二次调用同一个 HTTP 服务,这将 return 在第一次调用完成之前产生一个全新的 Observable。
现在,据我了解,我可以使用 switchMap 而不是 map 来丢弃旧的 Observable 并在新的 Observable 上操作?还是我理解有误?如果在第一个事件已经在链的订阅部分中之后触发第二个事件,会发生什么情况?这样的话就不会再切换了?而且由于 JS 是同步的,在第二个事件甚至开始处理其链之前,整个第一个链不会执行吗?
我想我对整个事情感到困惑,因为 Observable 的实例是不同的——Rx 如何跟踪要切换的调用?是函数名吗?假设我有 2 个独立的代码块:
this.myXYZService.search('abcd')
.map(r => { // some code })
.subscribe(r => { //some code });
this.myXYZService.search('efgh')
.map(r => { // some code })
.subscribe(r => { //some code });
如果我对以上两个都使用 switchMap 到底会发生什么?第二次调用会抵消第一次调用吗?
switchMap 在外部 observable 发出时取消之前的内部 observable。例如
Observable.fromEvent(inputEl, 'keydown') // outer observable
.switchMap(event => {
let value = event.value;
return this.myXYZService.search(value); // inner observable
})
.subscribe(res => {
// some code
});
在这种情况下,每次外部 observable (fromEvent) 发出(在输入元素的 keydown 时),都会调用内部 observable (myXYZService.search) 并取消先前的内部 observable。
你会想要像...
searchTerms.switchMap(
searchTerm => this.myXYZService.search(searchTerm)
).subscribe(...)
一旦出现新的搜索词,任何正在进行的搜索调用都将被忽略/丢弃。我不会使用取消这个词,因为电话还在响。但是,他们的结果将被忽略。
如果第一个请求 returns 在发出第二个搜索词之前,它将被发送到订阅。如果没有,那就不会。
Angular 和 RxJS 的新手,试图稍微了解一下...我的应用程序对 UI 事件做出反应,结果调用了一个 HTTP 服务 returns 是一个 Observable。我是这样订阅的:
this.myXYZService.search(query)
.map(r => { // some code })
.subscribe(r => { //some code });
假设该事件再次触发,并导致第二次调用同一个 HTTP 服务,这将 return 在第一次调用完成之前产生一个全新的 Observable。
现在,据我了解,我可以使用 switchMap 而不是 map 来丢弃旧的 Observable 并在新的 Observable 上操作?还是我理解有误?如果在第一个事件已经在链的订阅部分中之后触发第二个事件,会发生什么情况?这样的话就不会再切换了?而且由于 JS 是同步的,在第二个事件甚至开始处理其链之前,整个第一个链不会执行吗?
我想我对整个事情感到困惑,因为 Observable 的实例是不同的——Rx 如何跟踪要切换的调用?是函数名吗?假设我有 2 个独立的代码块:
this.myXYZService.search('abcd')
.map(r => { // some code })
.subscribe(r => { //some code });
this.myXYZService.search('efgh')
.map(r => { // some code })
.subscribe(r => { //some code });
如果我对以上两个都使用 switchMap 到底会发生什么?第二次调用会抵消第一次调用吗?
switchMap 在外部 observable 发出时取消之前的内部 observable。例如
Observable.fromEvent(inputEl, 'keydown') // outer observable
.switchMap(event => {
let value = event.value;
return this.myXYZService.search(value); // inner observable
})
.subscribe(res => {
// some code
});
在这种情况下,每次外部 observable (fromEvent) 发出(在输入元素的 keydown 时),都会调用内部 observable (myXYZService.search) 并取消先前的内部 observable。
你会想要像...
searchTerms.switchMap(
searchTerm => this.myXYZService.search(searchTerm)
).subscribe(...)
一旦出现新的搜索词,任何正在进行的搜索调用都将被忽略/丢弃。我不会使用取消这个词,因为电话还在响。但是,他们的结果将被忽略。
如果第一个请求 returns 在发出第二个搜索词之前,它将被发送到订阅。如果没有,那就不会。