Transform ObservableНаблюдаемым - PullRequest
3 голосов
/ 05 марта 2019

У меня есть API, который возвращает мне Array<string> идентификаторов, учитывая оригинальный идентификатор (один ко многим). Мне нужно сделать HTTP-запрос на каждый из этих идентификаторов, чтобы получить обратно связанные данные из API. Я не могу понять, как взять Observable<string[]> и сопоставить его с Observable<DataType[]>.

Я бы хотел сохранить исходную наблюдаемость и использовать операторы, чтобы получить желаемый результат, если это вообще возможно.

Трубопроводный оператор map не работает в этой ситуации из-за того, что единственным элементом в наблюдаемом объекте является массив.

Вот пример кода, который похож на реализацию, которую я пытаюсь выполнить.

getIds = (originalId: string) => {
 return this.http.get<string[]>(url);
}

getDataFromIds = (originalId: string): Observable<DataType[]> => {
  const ids$ = this.getIds(originalId);
  // Make http calls for each of the items in the array.
  result = ids$.pipe();

  return result;
}

Ответы [ 2 ]

3 голосов
/ 05 марта 2019

это тип использования для оператора switchMap, обычно с оператором forkjoin в качестве внутренней наблюдаемой.

getIds = (originalId: string) => {
 return this.http.get<string[]>(url);
}

getDataFromIds = (originalId: string): Observable<DataType[]> => {
  const ids$ = this.getIds(originalId);
  // Make http calls for each of the items in the array.
  result = ids$.pipe(switchmap(ids => forkJoin(ids.map(id => this.getId(id))));
  // map the array of ids into an array of Observable<DataType>, forkjoin them and switch into it.

  return result;
}

Это предполагает, что вызов getIds () приведет к списку строковых идентификаторов и чтоу вас есть функция getId (), которая принимает идентификатор строки и возвращает наблюдаемый DataType

0 голосов
/ 05 марта 2019

Вы можете попробовать это:

ids$.pipe(
  switchMap(ids => //you can swap switchMap with any *Map operator: https://www.learnrxjs.io/operators/transformation/
    forkJoin(...ids.map(id => //you swap forkJoin with any comb. operator: https://www.learnrxjs.io/operators/combination/
      from(Promise.resolve({ id })).pipe(
        map(res => res.id),
        catchError(err => of(err)))))));

Импорт для from, forkJoin должен быть из rxjs, а все остальное импортируется из rxjs/operators

catchError будет поймать любой брошенный необработанный ошибки.

Демо-версия: https://stackblitz.com/edit/rxjs-xmmhyj

...