requestRest(data1) {
// parallel request logic encapsulated in a function
return forkJoin(
this.req2(data1),
this.req3(data1),
this.req4(data1)
);
}
ngOnInit() {
// store id observable in a reusable variable (just to illustrate concept)
const id$ = this.route.params.pipe(
map(p => p['id'])
);
id$.pipe(
// switch off id into req1
switchMap(id => this.req1(id)),
// switch off req1 into rest of data
switchMap(data1 => this.requestRest(data1).pipe(
// inner map to combine data1 with rest of data
map(restOfData => [data1, ...restOfData])))
).subscribe(
([d1, d2, d3, d4]) => console.log("got all the data")
)
}
rx js - мощная библиотека для построения конвейеров для обработки потоков данных. Вы можете строить и составлять разные конвейеры, как считаете нужным. Существует некоторая кривая обучения, но как только вы ее преодолеете, вы сможете обрабатывать любой поток данных, о котором только можете подумать. Каждое внешнее событие (http-запросы, веб-наборы, входные данные форм, тайм-ауты, интервалы, щелчки, перемещения мыши и т. Д. c) представляет собой поток данных, и это делает rx js очень ценным инструментом для изучения.
Это своего рода тривиальный пример, поскольку rx js streams go, как последовательное и параллельное выполнение и преобразования, являются основой. Когда вы рассматриваете такие вещи, как обработка ошибок, повторная логика c, кеширование и другие, то есть то, что нужно большинству производственных приложений, оно становится еще более мощным.
switchMap
само по себе является одним из самых мощных инструменты, предлагаемые rx js, так как он обрабатывает отмену logi c, если параметр id должен был измениться во время выполнения ваших запросов, гарантируя, что вы получите результаты с правильным идентификатором, и не рискуете ошибками в условиях гонки между запросами.