Обрабатывать данные после http-запроса в angular

У меня есть служба, которая запрашивает данные из метода get, я хотел бы сопоставить ответ с объектом, хранящим некоторые идентификаторы, и использовать эти идентификаторы для выполнения других HTTP-запросов. Мне сказали, что обычно это не делается обратным вызовом, я посмотрел на этот Как вернуть ответ на асинхронный вызов?, но я не думаю, что это обычный способ реализации сервисов, любые подсказки очень ценятся.

Попытался добавить метод onInit/constructor в angular, чтобы убедиться, что объект был заполнен до того, как другие методы были вызваны без успеха.

@Injectable ()
export class ContactService  {
   storeIds;

   getIds(callback: Function) {
   this.http.get<any>(IdsUrl, Config.options).subscribe(res => {
       callback(response);
   });

   getIds(res => {
        this.storeIds = {
          profileId: res.profile,
          refIds: res.refIds
        }
     }
   )

   // this.storeIds returns undefined as it's an async call
   this.http.post<any>(WebserviceUrl + this.storeIds.profileId , data, headers )

   // .....Many other web services that relay on this Ids
}

в чем твоя проблема? с какой проблемой вы столкнулись в какой строке вашего кода?

Bear Nithi 08.03.2019 05:49

Вы хотите цепочку удаленных вызовов после получения ответа от вызова getIds? Я не понял эту часть. Или вы хотите куда-то поместить полученный ответ, чтобы использовать его для будущих вызовов API. Можешь прояснить?

santosh 08.03.2019 05:52

Я хочу сохранить эти идентификаторы где-нибудь для будущих вызовов API, без необходимости вводить кучу обратных вызовов для доступа к ним.

Jaime FH 08.03.2019 05:57

Вы собираетесь делать все эти звонки из службы контактов или из других служб? Я просто хотел знать, хотите ли вы, чтобы эти данные ответа находились вне службы контактов?

santosh 08.03.2019 06:06

Да, намерение состоит в том, чтобы вызвать его из других служб как «this.myService.postSomething(data, callback)» с уже существующим идентификатором

Jaime FH 08.03.2019 06:08

Просто создайте еще одну службу с именем StoreIdsService. Обновите ответ, полученный от вашего первого вызова API getIds в StoreIdsService. Идея состоит в том, чтобы использовать StoreIdsService как одноэлементную службу для сохранения состояния ваших storeId. Вы можете внедрить куда угодно, чтобы получить storeId.

santosh 08.03.2019 06:17

Хотя ответ удовлетворяет тому, что я искал, моя реальная проблема заключалась в том, что я неправильно настроил ответ, у меня было res => myObject = {id: res.id, id2: res.id2, ....}, и мне нужно было использовать Object.assign() или с оператором распространения :)

Jaime FH 09.03.2019 07:55
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
48
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете просто назначить службу response свойству storeIds внутри метода subscribe. и вызовите последующие службы внутри него, если вам нужно.

@Injectable ()
export class ContactService  {
   storeIds;

   getIds() {
   this.http.get<any>(IdsUrl, Config.options).subscribe(res => {
       this.storeIds = {
          profileId: response.profile,
          refIds: response.refIds
        }

      this.otherapicall1();
      this.otherapicall2();
   });

}
Ответ принят как подходящий

Просто создайте еще одну службу с именем StoreIdsService. Обновите ответ, полученный от вашего первого вызова API getIds в StoreIdsService. Идея состоит в том, чтобы использовать StoreIdsService как одноэлементную службу для сохранения состояния ваших storeId. Вы можете внедрить StoreIdsService в любой компонент, в котором хотите получить идентификаторы storeId.

Это один из многих способов обмена данными в angular между компонентами.

Пожалуйста, обратитесь к этому ответу, который кто-то опубликовал.

Как обмениваться данными между компонентами в Angular 2?

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