丢弃慢速休息呼叫

常见的用例是丢弃某些用户输入后不再需要的某些休息呼叫。最突出的例子是,当用户使用某些搜索功能时,发出请求,发出另一个请求,并且由于某种原因,第一个请求在第二个请求之后到达,并且应用程序显示旧请求的过期数据。

这是 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);

查看现场演示: https//jsbin.com/suzakahoro/1/edit?js,console