使用 rxjs 将数据添加到 http 响应
Add data to http response using rxjs
我有一个包含 driver ID 的旅行实体。
我可以使用 RESTFull 端点获取行程,例如/trips/2/
。
//example response
{
id: "2",
driver_id: "123"
}
我可以使用端点获取 driver 详细信息。例如/drivers/123/
,
我最后尊重的回应是
//expected response from observable
{
id: "2",
driver_id: "123",
detailed_driver: {
name: "abc",
id: "123"
}
}
目前我是这样操作的
this.http("/trips/2/").map(data => data.json()).subscribe(trip => {
this.http("/drivers/" + trip.driver_id + "/").map(data => data.json()).subscribe(driver => {
trip.detailed_driver = driver;
this.trip = trip
}
}
我如何使用 Rxjs 来使用这两个端点从单个 observable 获得最终的预期响应?
您可以使用 flatMap
运算符和 Observable.forkJoin
,如下所述:
this.http.get('/trips/someid')
.map(res => res.json())
.flatMap(res => {
return Observable.forkJoin([
Observable.of(res),
this.http.get('/drivers/'+res['driver_id']).map(res => res.json())
]);
})
.map(res => {
res[0]['detailed_driver'] = res[1];
return res[0]
})
.subscribe(
(data) => {
}
);
flatMap
允许在收到第一个请求时执行另一个请求。 Observable.forkJoin
允许在最后接收第一个响应的响应和第二个响应的结果。
这样您就可以用第二个结果更新第一个结果...
我有一个包含 driver ID 的旅行实体。
我可以使用 RESTFull 端点获取行程,例如/trips/2/
。
//example response
{
id: "2",
driver_id: "123"
}
我可以使用端点获取 driver 详细信息。例如/drivers/123/
,
我最后尊重的回应是
//expected response from observable
{
id: "2",
driver_id: "123",
detailed_driver: {
name: "abc",
id: "123"
}
}
目前我是这样操作的
this.http("/trips/2/").map(data => data.json()).subscribe(trip => {
this.http("/drivers/" + trip.driver_id + "/").map(data => data.json()).subscribe(driver => {
trip.detailed_driver = driver;
this.trip = trip
}
}
我如何使用 Rxjs 来使用这两个端点从单个 observable 获得最终的预期响应?
您可以使用 flatMap
运算符和 Observable.forkJoin
,如下所述:
this.http.get('/trips/someid')
.map(res => res.json())
.flatMap(res => {
return Observable.forkJoin([
Observable.of(res),
this.http.get('/drivers/'+res['driver_id']).map(res => res.json())
]);
})
.map(res => {
res[0]['detailed_driver'] = res[1];
return res[0]
})
.subscribe(
(data) => {
}
);
flatMap
允许在收到第一个请求时执行另一个请求。 Observable.forkJoin
允许在最后接收第一个响应的响应和第二个响应的结果。
这样您就可以用第二个结果更新第一个结果...