Использование результата возврата из запросов 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;
        }),
Другие вопросы по тегам