Выполнение динамического количества https синхронно с использованием Observable - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть массив URL, для которых мне нужно последовательно выполнить http.get.И, в зависимости от результата, переходите к следующему элементу в массиве.

Например:

var myArray = this.myService.getUrls();
// myArray can be something like this:
// ['http://www.us.someurl.com', 'http://www.hk.anotherurl.com']
// Or...
// ['http://www.us.randomurl.com']
// Or...
// ['http://www.us.someurl.com', 'http://www.hk.notaurl.com', 'http://www.pl.someurl.com', 'http://www.in.boringurl.com]

Когда я выполняю http.get для каждого из них, мой сервер будетответить в его данных что-то вроде строки {isReady: true} или {isReady: false}

Что я хочу, чтобы иметь возможность сделать это для каждого элемента в myArray, выполнить http.get, и еслирезультат этого отдельного вызова isReady = true, не выполняет следующий http.get в массиве.Если isReady = false, перейдите к следующему URL-адресу в массиве.

Я пробовал flatMap, но, похоже, я не могу обойтись без жесткого кодирования URL-адресов:

var myArray = ['http://www.us.someurl.com', 'http://www.hk.anotherurl.com'];

this.http.get('http://www.us.someurl.com')
    .map(res => res.json())
    .flatMap(group => this.http.get('http://www.hk.anotherurl.com') )
    .map(res => res.json())
    .subscribe((res) => {
       console.log(res);
    });
});

1 Ответ

0 голосов
/ 21 февраля 2019

Вы можете достичь этого, используя комбинацию concatMap, filter и take:

const URLS = ['http://www.us.someurl.com', 'http://www.hk.anotherurl.com'];

// ...
public getResponse()
{
  return from(URLS).pipe(
    concatMap(url => this.http.get<{ isReady: boolean }>(url)),
    filter(({ isReady }) => isReady),
    take(1),
  );
}

DEMO

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...