Принимая внутренние наблюдаемые, когда внешнее завершено - PullRequest
1 голос
/ 06 мая 2020

Я новичок в Rx JS, поэтому даже не уверен, правильно ли я назвал вопрос.

Чтобы объяснить, чего я пытаюсь достичь: у меня есть одна конечная точка API, которая приводит к массив объектов с идентификаторами. Затем я буду вызывать другую конечную точку API с каждым идентификатором, который я получил в массиве, во многих вызовах. Я хочу, чтобы данные, получаемые подписчиком первого API, уже включали ответ на второй вызов API.

StackBlitz: https://stackblitz.com/edit/rxjs-u45wvq

в настоящее время, значения thatThing являются наблюдаемыми - и я хочу, чтобы они были полученными объектами.

Edit

Мне удалось добиться того, что я хотел, но, на мой взгляд, это выглядит грязно - поскольку решение использует класс Promise для его решения.

https://stackblitz.com/edit/rxjs-d5ywen

Я блуждаю, если есть Rx JS способ сделать то же самое:

const source = fetchApi1().pipe(
  map(x => {
    return new Promise((yes, no) => {
      const s = x.array.map(m => fetchApi2(m.id))
      forkJoin(...s).subscribe(api2 => {
        x.array.forEach((row, i) => {
          row.thatThing = api2[i]
        })
        yes(x)
      })
    })
  }),
  switchMap(x => from(x))
);

1 Ответ

1 голос
/ 06 мая 2020

Всегда лучше избегать создания вложенных подписок, чтобы вы могли переписать то, что у вас есть, например, следующим образом:

const source = fetchApi1().pipe(
  mergeMap(x => {
    const s = x.array.map((m: any) => fetchApi2(m.id)
      .pipe(
        map(response => {
          m.thatThing = response;
          return m;
        }),
      ));

    return forkJoin(s).pipe(mapTo(x));
  }),
);

Живая демонстрация: https://stackblitz.com/edit/rxjs-3nrc7g?file=index.ts

...