У меня есть 2 конечные точки:
users = [
{
id: 1,
name: 'Mark',
companyId: 1
},
{
id: 2,
name: 'Jack',
companyId: 1
},
]
companies = [
{
name: 'Facebook',
id: 1
}
]
Теперь, как я могу создать свой наблюдатель, чтобы получить название компании у каждого пользователя? Так что в моем html я могу сделать, например. user.company.name
Мой метод получения сейчас: baseUrl — это локальный хост: 3000/пользователей.
getUsers(): Observable<IUser[]> {
return this.http.get<IUser[]>(this.baseUrl).pipe(
share()
);
}
Используйте forkJoin для параллельного получения данных о пользователях и компаниях, а затем сопоставьте результат с требуемым типом.
forkJoin([
this.http.get<IUser[]>(this.baseUrl + '/users'),
this.http.get<IComapany[]>(this.baseUrl + '/comapnies')
]).pipe(map(([users, companies]) => users.map(user =>
{
return {
"id": user.id,
"name": user.name,
"company": companies.find(x=> x.id == user.companyId)
}
})
))
Краткий ответ forkJoin
.
Пример:
const usersObservable = this._http.get('https://example/api/users');
const companiesObservable = this._http.get('https://example/api/companies');
const usersAndCompanies = Observable.forkJoin([usersObservable, companiesObservable])
.subscribe(
result => return this._joinUsersAndCompanies(result)
);
private _joinUsersAndCompanies(result) {
const users = result[0];
const companies = result[1];
return users.map(user => {
const matchedCompany = companies.find(company => company.Id === user.companyId);
return {
...user,
companyName: matchedCompany!.name
};
});
}
Это всего лишь черновик, и я не уверен, что он скомпилируется и запустится должным образом, но я надеюсь, что вы поняли идею.
Если вам нужно часто получать информацию о пользователях и компаниях из API или объем возвращаемых данных велик, вы можете оптимизировать их путем первого преобразования и сохранения const companies
на карте, чтобы иметь к ним доступ в постоянное время bigO(1)
.