Использование результата возврата из запросов api с помощью Forkjoin с mergeMap и pipe
Я хотел бы использовать результаты возврата из нескольких запросов api и повторно использовать их в качестве параметра для второго запроса api, а второй запрос api возвращает результат, который я должен повторно использовать в третьем запросе api!
Проблема в том, что я могу вернуть только один api
const email = this.credentialsForm.controls['email'].value;
this.http.get('https://drupal_users/index/' + email).pipe(
map(users => {
console.log(users);
const user = users;
this.userId = user;
return user;
}),
mergeMap(user => {
const ObservateurCulture = this.http.get('https://index.php/drupal_users/culture/' + email).subscribe((culture: any) => {})
// Here i wish to reuse "culture" data in another Api call and reuse result again of "Parcelles" api request
const Parcelles = this.http.get('https://index.php/drupal_users/totherdata/' + culture);
return forkJoin([ObservateurCulture, Parcelles]);
}),
take(1)
).subscribe(result => {
console.log(result);
this.loading.dismiss();
});
1 ответ
Если вы хотите получить только результат из последнего api, mergeMap
более чем достаточно для всего.
Однако, если вы хотите, чтобы все данные были объединены из всех API, вам необходимо использовать дополнительные pipe
а также map
Вот пример фрагмента!
let userId = -1;
const email = 'test';
const getUser = (email) => rxjs.of(1)
const getCulture = (email) => rxjs.of('en-US')
const getData = (culture) => rxjs.of({
data: {}
})
const getResultFromLastApi = (email) => {
getUser(email).pipe(
rxjs.operators.tap(userId => {
userId = userId;
}),
rxjs.operators.mergeMap(userId => getCulture(email)),
rxjs.operators.mergeMap(culture => getData(culture)),
rxjs.operators.take(1)
).subscribe(result => {
console.log(result);
});
}
const getCombinedResult = () => {
getUser(email).pipe(
rxjs.operators.tap(userId => {
userId = userId;
}),
rxjs.operators.mergeMap(userId => getCulture(email).pipe(rxjs.operators.map(culture => ({
userId,
culture
})))),
rxjs.operators.mergeMap(cultureAndUser => getData(cultureAndUser.culture).pipe(rxjs.operators.map(data => ({ ...data,
...cultureAndUser
})))),
rxjs.operators.take(1)
).subscribe(result => {
console.log(result);
});
}
getResultFromLastApi(email);
getCombinedResult(email);
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.5.5/rxjs.umd.js"></script>
Также
map(users => {
console.log(users);
const user = users;
this.userId = user;
return user;
}),
я хотел бы использовать tap
вместо того map
в этом разделе, поскольку вы не преобразуете данные, но вызываете побочный эффект в приложении (назначьте userId где-нибудь в приложении)
tap(userId => {
console.log(userId);
this.userId = userId;
}),