#angular #rxjs #ngx-bootstrap
#угловое #rxjs #ngx-bootstrap
Вопрос:
У меня есть следующий угловой код, который вызывает службу, которая возвращает наблюдаемый
this.dataSource = Observable.create((observer: any) => {
observer.next(this.asyncSelected);
})
.pipe(
mergeMap((token: string) =>
this._animalSuffixesServiceProxy.getAll(token, undefined, undefined, undefined)
)
);
getAll
Метод возвращает наблюдаемый в следующем формате:
{"result":{"totalCount":2,"items":[{"animalSuffix":{"name":"Test","id":1}},{"animalSuffix":{"name":"Test2","id":2}}]}}
Предполагая, что изменение способа getAll
работы не является опцией, я хотел бы знать, как наилучшим образом передать этот ответ через наблюдаемые операторы, чтобы я мог получить сглаженный наблюдаемый объект, который выглядит следующим образом:
[{"name":"Test","id":1},{"name":"Test2","id":2}]
Ответ №1:
Вы должны иметь возможность использовать map
оператор для обработки вашего ответа в желаемом формате. Это должно быть похоже на следующее:
this.dataSource = Observable.create((observer: any) => {
observer.next(this.asyncSelected);
})
.pipe(
mergeMap((token: string) =>
this._animalSuffixesServiceProxy.getAll(token, undefined, undefined, undefined)
),
map(response => response.result.items.map(item => item.animalSuffix))
);
Это сопоставляет ваш ответ с массивом ваших элементов, причем значение для каждого элемента является animalSuffix
значением элемента ответа.
map
В pipe()
— это оператор RxJS для отображения над каждым элементом, испускаемым в наблюдаемом. Другой map
— оператор массива (оба они ведут себя одинаково).
Комментарии:
1. Спасибо за ваш ответ, он указал мне правильное направление. Однако я обнаружил, что мне пришлось поместить в
map
качестве канала внутриmergeMap
наблюдаемого ответаgetAll()
. Мое понимание наблюдаемых очень ограничено, но ожидается ли это?2. @tkha007 Вам не нужно это делать там. Вы должны получить тот же результат, если вытащите свой измененный код
pipe
, который вы добавили в свой.getAll(...)
, и поместите его туда, где у меня было выше. Что вы испытывали, что было другим?3. Если я сохраню его, как вы предложили, tsc пожалуется на эту ошибку
Property 'result' does not exist on type '{}'