TypeScript foreach () с асинхронным HTTP-запросом


У меня проблема с моим угловым веб-приложением. Я пытаюсь перебрать массив и каждый раз делать HTTP-запрос для получения идентификатора Module, который является объектом:
{name:string, charge:string} После того, как я обновил каждый модуль новым свойством id, я хочу кое-что сделать с этими идентификаторами. Для этого мне нужны все идентификаторы, и я не могу обрабатывать каждый Module по отдельности. Как мне этого добиться? Я знаю, поскольку функция http.get() в Angular является асинхронной, я не могу просто вставить свой код после цикла foreach().

Вот мой код:

ngOnInit() {
let fit = parseFit(megafit.default.fit);
fit.modules.forEach(Module => {
  this.http.get(`https://esi.tech.ccp.is/v2/search/?categories=inventory_type&search=${Module.name}&strict=true`)
  .subscribe((data:any) => {
    Module.id = data.inventory_type
  })
});
//Do smth. with all the IDs 

}

С уважением,
Янв

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
0
602
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Используйте обещания вместо подписчиков

ngOnInit() {
let fit = parseFit(megafit.default.fit);
const jarOfPromises =[];
fit.modules.forEach(Module => {
jarOfPromises.push(
  this.http.get(`https://esi.tech.ccp.is/v2/search/?categories=inventory_type&search=${Module.name}&strict=true`)
  .toPromise())
});

Promise.all(jarOfPromises).then(results=>{
/** your code **/
});

Имейте в виду, что я написал это на свой мобильный телефон ?

почему OP должен использовать обещания вместо наблюдаемых?

Jota.Toledo 24.11.2018 16:43

Это просто способ достичь того, о чем он просит. В этом случае я думаю, что проще использовать обещания вместо более сложных операторов RXJS.

Gabriel Lopez 24.11.2018 16:47
Ответ принят как подходящий

Для этого вам понадобятся некоторые операторы RxJS.

Используйте от, чтобы преобразовать Module[] в Observable<Module>, затем направьте поток в mergeMap и выполните запрос api. Используйте кран, чтобы изменить объект вашего модуля на результат API и, наконец, использовать toArray для сбора ответов. Подпишитесь на поток, чтобы выполнить действие, которое вы хотите выполнить, когда все модули будут обработаны.

пример:

from(fit.modules).pipe(
    mergeMap(module => this.http.get(...).pipe(
        tap(apiResponse => module.id = apiResponse.inventory_type)
    )),
    toArray()
).subscribe(allResponses => {
    // do your action
});

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