Как выполнить несколько HTTP-запросов из массива с помощью RX JS? - PullRequest
0 голосов
/ 18 июня 2020

В настоящее время я разрабатываю службу syn c с Angular. Здесь я делаю запрос к базе данных и получаю обратно массив URL-адресов. Теперь я хочу последовательно обработать каждый URL. Вот мой код:

    return this.http.get<any[]>(url + '/recovery').pipe(
        map((response: any) => {

            return from(response).pipe(
                concatMap((item: any) => {

                    switch (item.method) {
                        case 'POST':
                            return this.post(item.url, item.data);
                        case 'PUT':
                            return this.update(item.url, item.data);
                        case 'DELETE':
                            return this.delete(item.url);
                    }
                })
            );
        })

Возвращенный массив начального HTTP-запроса выглядит примерно так:

[
    {method: 'POST', url: 'xxx.com/aaa', data: {...}},
    {method: 'POST', url: 'xxx.com/bbb', data: {...}},
    {method: 'PUT', url: 'xxx.com/ccc'},
]

На следующем шаге я оформляю подписку, например:

this.restService.syncRecovery().subscribe(response => {
    console.log('SYNC DONE', response);
});

Подписка работает, но «внутренние» HTTP-запросы (concatMap) не обрабатываются. Я ожидаю, что это будет простая проблема, но я не могу ее найти и надеюсь, что кто-нибудь здесь может оказать некоторую поддержку, пожалуйста.

Thx!

1 Ответ

1 голос
/ 18 июня 2020

Все выглядит нормально, за исключением того, что вам нужно использовать switchMap вместо map в качестве родительского оператора сопоставления.

return this.http.get <any[]> (url + '/recovery').pipe(
  switchMap((response: any) => {            // <-- `switchMap` here
    return from(response).pipe(
      concatMap((item: any) => {
        switch (item.method) {
          case 'POST':
            return this.post(item.url, item.data);
          case 'PUT':
            return this.update(item.url, item.data);
          case 'DELETE':
            return this.delete(item.url);
        }
      })
    );
  })
);

И я предполагаю this.post, this.update , и this.delete - это оболочки для HTTP-запросов.

...