【发布时间】:2018-07-20 05:49:17
【问题描述】:
试图围绕 Observables 和链接/嵌套 HTTP 请求。
假设我的遛狗 API 后端有以下 REST 端点,这些端点无法更改:
-
GET /dogs(返回所有狗):[ { id: 1, name: 'Fido' }, { id: 2, name: 'Barky' }, { id: 3, name: 'Chip' }, { id: 4, name: 'Bracken' } ] -
GET /walker/:id(返回一个遛狗者):{ id: 1, name: 'John Doe' } -
GET /pairings(返回狗和步行者之间的所有配对):[ { id: 1, dogIds: [2], walkerId: 1 }, { id: 2, dogIds: [1, 3], walkerId: 2 } ]
业务规则
- 一对正好有 1 个步行者
- 配对包含 1 只或多只狗的列表
- 狗可以是 0 或 1 对的一部分
- 助行器可以是 0 或 1 对的一部分
目标
我想提供一个步行者和狗之间所有配对的列表,按步行者名称排序。我想按名称对每个步行者的狗进行分类。我不想展示任何没有主动配对的步行者或狗,例如:
Walker | Dogs
-------------+-----------
John Doe | Barky
Jan Kowalksi | Chip, Fido
我的思考过程
- 同时请求所有
/pairings和/dogs - 等待这两个请求完成
- 遍历每个
pairing并填充dogs字段 - 从每个
pairing中提取walkerId并并行请求每个/walker/:id - 等待所有这些请求完成
- 遍历每个
pairing并填充walker字段
我觉得我可以使用 Promises 轻松做到这一点,但我正在努力让我的大脑适应 Observables 中的思考。这是我到目前为止所得到的(使用 Angular 的 HttpClient):
function getDogWalkerPairings() {
return Observable.forkJoin([
this.http.get('/pairings'),
this.http.get('/dogs')
])
.map(
(res) => {
const pairings = res[0];
const dogs = res[1];
return pairings.map(p => {
const pDogs = p.dogIds.map(dogId =>
dogs.find(d => (d.id === dogId)
);
return Object.assign({ dogs: pDogs }, p);
});
}
)
.map((pairingsWithDogs) => {
return Observable.forkJoin(
pairingsWithDogs.map(p => this.http.get('/walkers/' + p.walkerId))
);
})
.map((walkers) => {
// uhhh... where to now?
// I don't have a reference to pairings in this scope :/
});
}
【问题讨论】:
标签: angular rxjs observable