Observables - Angular - .map не работает, но .subscribe работает

У меня есть конечная точка, которая называется и выглядит так:

organizationSubsidiaries(sfid: string) {
  const url = `${this.baseURL}/${ENDPOINTS.organizations}/${this.organization.id}/${ENDPOINTS.subsidiaries}`;
  return this.http.get(url).map(res => res.json());
}

Если я назову это так, он работает и консолей правильно:

getOrgSubsidiaries(id) {
  return this.organizationSubsidiaries(id)
    .subscribe(data => { //changing this to .map means it won't work!

      let subsidiaryNames = []
      data.forEach(sub => {
        console.info(sub.SubsidiaryName)
        subsidiaryNames.push(sub.SubsidiaryName)
      })
      subsidiaryNames = subsidiaryNames.filter(this.onlyUnique);

      console.info('data from subsidiaries' + JSON.stringify(subsidiaryNames))

    });
}

Когда это .map, он не работает, но мне нужно, чтобы это был .map, так как мне нужно указать subscribe в другом файле, чтобы я мог асинхронно использовать данные в другом компоненте:

ngOnInit(): void {
  this.engagementService.getOrgSubsidiaries(id).subscribe(data => {
     this.orgSubsidiaries = data;
});

Мне он нужен, чтобы .map также работал так же, как и subscribe, поэтому я могу использовать subscribe с ним и использовать данные в другом моем компоненте!

В немного другой проблеме эта функция в другом моем компоненте не распознает id.

Я подозреваю, что res.json () внутри map () ломается из-за типа содержимого ответа. Во-первых, убедитесь, что ответ имеет формат JSON (я вижу, что в вашем фрагменте вызывается .json ()). наконец, включите оператор .catch и найдите выданную ошибку, чтобы узнать, почему она не работает. Вы можете увидеть одно из этих сообщений, если в консоль войдете в catch developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…

KQI 11.10.2018 12:17

в angular 6 вам не нужен res.json() на карте, поскольку по умолчанию ответ json

Niladri 11.10.2018 12:20
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
2
1 776
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

использовать трубу в rxjs 6

 return this.http.get(url).pipe( map(res => res.json()));

импортировать карту

import { map } from 'rxjs/operators'
res.json() не требуется в Angular 6, если вы используете HttpClient.
Niladri 11.10.2018 12:16

Я получаю эту ошибку при наведении указателя мыши на часть карты в вашем ответе «Не удается найти имя» карта ». Вы имели в виду "Карта"? '

Sparlarva 11.10.2018 12:18

Какая у вас версия rxjs?

Sachila Ranawaka 11.10.2018 12:20

Я использую версию 6.1.0

Sparlarva 11.10.2018 12:22

npm говорит 6.1.0, но мой пакет json говорит 5.5.0

Sparlarva 11.10.2018 12:24

Ошибка исчезла, но консоль данных по-прежнему не работала,

Sparlarva 11.10.2018 12:30

в angular 6 вам не нужно конвертировать в .json(). Angular сделает это за нас. просто удалите весь оператор карты, если вы используете его только для .json()

Sachila Ranawaka 11.10.2018 12:31

Как мне написать строку без .map?

Sparlarva 11.10.2018 12:53

просто return this.http.get(url)

Sachila Ranawaka 11.10.2018 12:55
Ответ принят как подходящий

Проблема зависит от двух вещей:

  1. Какую версию Angular вы используете.
  2. Используете ли вы HttpClient или Http

Давайте сначала поговорим об Angular версии:

Если вы используете Angular 6, он поставляется с Rxjs 6. Таким образом, для любого значения типа Observable вы не сможете использовать такие операторы, как map, напрямую, импортируя их из их путей и связывая их со значением Observable. В этом случае вам нужно будет использовать .pipe, который будет доступен для значения Observable, а внутри этого .pipe вы можете затем использовать своих операторов.

Например:

import { map } from 'rxjs/operators';
...
return this.http.get('...').pipe(map(...))  // This returns an Observable too

Если вы используете Angular 5, 4 или 2, он поставляется с предыдущими версиями Rxjs. Таким образом, для любого значения типа Observable вы сможете использовать операторы, такие как map, напрямую, импортировав их из их путей и связав их со значением Observable. В этом случае вам не придется использовать .pipe.

Например:

import 'rxjs/add/operators/map';
...
return this.http.get('...').map(...)  // This returns an Observable too

Теперь давайте поговорим о том, используете ли вы HttpClient или Http:

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

constructor(private http: HttpClient, ...) {}
...
return this.http.get(...); // This will return the Actual Response DATA

Если вы используете Http, вам нужно будет отправить ответ map, позвонив по нему в .json.

Итак, в случае Angular 2,4,5 это будет выглядеть примерно так:

import 'rxjs/add/operators/map'
...
constructor(private http: Http, ...) {}
...
return this.http.get(...).map(res => res.json());

А в случае Angular 6, я думаю, Http был удален. Таким образом, вы не сможете внедрить это в первую очередь как зависимость.

Обновлено

Я думаю, проблема в том, что вы не внедрили Http или HttpClient в качестве зависимости в свою службу EngagementService. Отсюда и ошибка.

В случае Angular 6:

Просто добавьте constructor, который вводит HttpClient как зависимость.

Я angular 6, я пробовал первый метод, ошибок нет, но я все еще не могу консольировать данные, как это было с методом подписки, я не уверен насчет http или клиента, которого я не вижу ни в файл

Sparlarva 11.10.2018 12:37

кроме этого: импортируйте {URLSearchParams, RequestOptions} из '@ angular / http';

Sparlarva 11.10.2018 12:37

Возможно, то, как я написал свою функцию, не будет работать с тем, как работает карта?

Sparlarva 11.10.2018 12:38

Не могли бы вы создать Образец StackBlitz, воспроизводящий эту вашу проблему?

SiddAjmera 11.10.2018 12:41

Дайте мне знать, если все в порядке, пожалуйста, извините, это не потрясающе, мои проекты не простые

Sparlarva 11.10.2018 12:50

Мне также понадобится код от EngagementService для работы с ним. Такие вещи, как http, типа Http или HttpClient, нужно понимать.

SiddAjmera 11.10.2018 12:51

Hello.component - это сервис взаимодействия.

Sparlarva 11.10.2018 12:55

Как компонент может быть службой? Я хочу видеть, что код вашего файла EngagementService - это то, что я имел в виду.

SiddAjmera 11.10.2018 12:56

Другие вопросы по теме