Преобразование http ответа без вложенной карты () - PullRequest
0 голосов
/ 08 июля 2019

Я думаю, что здесь чего-то не хватает, поскольку я нахожу использование Angular http.get с pipe (map) из RXJS довольно противоречивым:

Бэкэнд возвращает массив простых объектов (см. Unifiedparams интерфейс ниже). Я хочу извлечь Observable<String[]> и передать его в app.component.html , где я использую *ngFor="let param of params$ | async" для создания раскрывающегося списка.

Кажется, я не могу получить доступ к атрибуту name без вложенных карт, хотя возвращаемый json представляет собой одномерный массив.

fetchParams(): Observable<String[]>{
    const result = this.http.get<unifiedParam[]>('http://localhost:5000/getparams');
    const params:Observable<String[]> = result.pipe(map(unifiedParams => res.map(unifiedParam=>unifiedParam.name)));
    return params;
}

Это, кажется, указывает на то, что Observable является самим массивом, но использование this.http.get<unifiedParam> и rows:Observable<String> соответственно приводит к тому, что строк будет пустым:

fetchParams(): Observable<String>{
    const result = this.http.get<unifiedParam>('http://localhost:5000/getparams');
    const params:Observable<String> = result.pipe(map(unifiedParam=> unifiedParam.name)));
    params.pipe(tap(console.log)); //doesn't print anything
    return params;   
}

Итак, мой вопрос здесь, если использовать Observable<UnifiedParam[]> и .pipe(map(res=>map(el=>el.name) - это путь.

Спасибо!

Обновление: забыл интерфейс:)

интерфейс unifiedParam { имя: строка, Источник: Строка }; * * Тысяча тридцать одна

Обновление 2: чтобы уточнить, что меня озадачивает: Зачем мне нужна внешняя функция map (). Не определен ли map () для массивов?

Ответы [ 2 ]

0 голосов
/ 08 июля 2019

Вы можете преобразовать array в Observable и отобразить его на карте, а затем использовать только один оператор карты (из Observable на этот раз):

fetchParams(): Observable<String> {
  return this.http.get<UnifiedParam[]>('http://localhost:5000/getparams')
             .pipe(
                 mergeMap(unifiedParams => from(unifiedParams)),
                 map(unifiedParam => unifiedParam.name) 
              )
}

Обратите внимание, что вы не получитеObservable<String[]>, но напрямую Observable<String>, я не знаю, подходит ли вам это

0 голосов
/ 08 июля 2019

Я не совсем уверен, что понимаю ваш вопрос / потребность.

Если ваш серверный API возвращает массив UnifiedParam модели, то есть UnifiedParam[], и вам нужно получить массив имен, поэтому string[], и если ваша модель выглядит следующим образом:

UnifiedParam {
  ...
  name: string
  ...
}

так что ваш первый подход в порядке.

Просто небольшой рефакторинг вашего кода:

fetchParams(): Observable<String[]> {
  return this.http.get<UnifiedParam[]>('http://localhost:5000/getparams').pipe(
    map(unifiedParams => unifiedParams.map(unifiedParam => unifiedParam.name)) 
  )
}

Мой совет также состоит в том, чтобы правильно вводить ваши модели, а также использовать полные имена переменных / аргументов.(например, внутри map оператор: unifiedParams ...).

Это поможет сохранить ясность и удобство сопровождения кода.

Обновлено

В вашем коде есть 2 map функции:

  • one - это функция карты массива, которая выполняет итерацию для каждого элемента массива и преобразует его, возвращая его «проекцию» или любой другой новый объект.
  • second, isоператор Observable, который означает: для каждого значения, испускаемого в потоке, преобразуйте его в другое значение.

Итак, другими словами:

  • вызывает запрос Get Http для получения списка UnifiedParam.
  • , когда сервер отвечает, получаетпоток (Observable) только с одним значением (массив UnifiedParam), и затем этот поток завершится сам.
  • для каждого значения в потоке (поэтому единственном), мы преобразуем его (массивUnifiedParam) к новому массиву имен.

Надеюсь, это обновление станет более понятным.

...