Как я могу создать массив наблюдаемых / http запросов на основе ключей в массиве, которые возвращаются из другой наблюдаемой - PullRequest
0 голосов
/ 31 октября 2018

Так что я пытаюсь обернуть голову вокруг Observables, и по большей части они имеют смысл - но все документы предполагают, что вы на самом деле работаете с потоком данных - и Angular делает каждый вызов http по умолчанию наблюдаемым даже если это не потоки, а изолированные возвращаемые значения, что вызывает у меня некоторую путаницу.

Итак, я делаю http-вызов, который возвращает массив объектов. Затем мне нужно отобразить этот массив и создать новый HTTP-вызов на основе ключа в каждом объекте. Затем мне нужно собрать все ответы от этих вызовов и отобразить исходный массив, чтобы установить свойство на основе ответов от этого второго массива вызовов.

Извините кодекс Судо

this._http.get<>(url).subscribe(value => myData = value);

, который возвращает массив типа

[
{ clientId: 1, ..additional properties},
{ clientId: 2, ..additional properties},
]

Тогда мне нужно сопоставить это и породить новые http-вызовы, например

response.map(item => {
 this._http.get(`someurl/${item.clientId})
}

Затем мне нужно объединить все эти вызовы в один блок данных, чтобы я мог сделать что-то вроде

myData.map(item => {
item.fullClient = ArrayOfClientReturns.find(client => client.id === item.clientId);
}

Моя проблема в том, что я полностью понимаю, как сделать это с обещаниями, но с наблюдаемыми я действительно не уверен. Я понимаю, как использовать pipe (map ()) для объединения наблюдаемых, но я не понимаю, как отобразить массив данных и создать коллекцию наблюдаемых, основанных на ответе исходной наблюдаемой, а затем ждать, пока они все разрешите, затем заново сопоставьте исходный набор данных следующим образом.

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

Если бы кто-то мог указать мне правильное направление, я был бы благодарен.

1 Ответ

0 голосов
/ 31 октября 2018

Вы абсолютно на правильном пути, вы должны иметь возможность использовать что-то вроде forkJoin, которое объединит массив Observables

 this._http.get<any[]>(url).pipe(
        mergeMap(arr => forkJoin(arr.map((item) => this._http.get(`someurl/${item.clientId}`).pipe(map((name) => {
           item.name = name;
           return item;
        })
 ))))

Здесь мы используем функцию массива map для преобразования массива объектов в массив Observable s. Затем мы используем forkJoin, чтобы объединить массив наблюдаемых в один, и мы используем mergeMap, чтобы присоединить его к исходному запросу.

(Обратите внимание, что используется новый синтаксис rxjs с pipe, но это может быть сделано и с более старым синтаксисом)

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