我想使用多个 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();
});
如果你想只从最后一个api请求中获取结果。mergeMap
足够应付所有的事情了。
但是,如果你想把所有apis的数据合并起来,你必须使用附加的 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;
}),