使用合并Map和管道的Forkjoin,使用api请求的返回结果。

问题描述 投票:1回答:1

我想使用多个 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();

    });
rxjs pipe observable fork-join mergemap
1个回答
0
投票

如果你想只从最后一个api请求中获取结果。mergeMap 足够应付所有的事情了。

但是,如果你想把所有apis的数据合并起来,你必须使用附加的 pipemap

这是示例片段!

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;
        }),
© www.soinside.com 2019 - 2024. All rights reserved.