丢弃慢速休息呼叫
常见的用例是丢弃某些用户输入后不再需要的某些休息呼叫。最突出的例子是,当用户使用某些搜索功能时,发出请求,发出另一个请求,并且由于某种原因,第一个请求在第二个请求之后到达,并且应用程序显示旧请求的过期数据。
这是 switchMap
-operator 的完美用例。
searchInput$
.switchMap(() => makeRestCall());
在这种情况下,流将进入休息呼叫,但只有在 searchInput$
上发出新数据之后,才会丢弃 switchMap
内的流并进行新的休息呼叫。因此,如果在下次点击之前完成,则仅考虑休息结果。
这是一个完全成熟的模仿的例子:
// some initial data-mocking
const Observable = Rx.Observable;
var counter = 1;
function mockDataFetch() {
return Observable.of(counter++)
.delay(500);
}
// the recipe
const searchInput$ = new Rx.Subject();
searchInput$
.do(searchInput => console.log("Searching for " + searchInput))
.switchMap(searchInput => mockDataFetch()
.map(result => ({result, searchInput}))
)
.do(data => console.log("Received result for " + data.searchInput + ": " + data.result))
.subscribe();
// simulating search inputs
searchInput$.next("google");
setTimeout(() => searchInput$.next("froogle"), 600);
setTimeout(() => searchInput$.next("doodle"), 800);
setTimeout(() => searchInput$.next("poodle"), 1000);
setTimeout(() => searchInput$.next("noodle"), 1600);