RXJS опрос без рекурсии - PullRequest
0 голосов
/ 05 января 2019

Сервер обрабатывает несколько запросов одновременно. Позвоните в службу, чтобы проверить статус каждого запроса. Сервис принимает список идентификаторов и присваивает статус каждому идентификатору следующим образом

{ id: number, status: number}; Status 1 is pending and 2 is complete

Требуется опросить все идентификаторы ожидающих запросов, пока все запросы не будут выполнены

У меня есть следующее рекурсивное решение, но для него нужно краткое решение RXJS

 poll(requestIds: Array<number>): void {
    if (requestIds.length > 0) {
        callService(requestIds).subscribe((response) => {
            const pending = response.reduce((result, request) => {
                if (request.status === 1) { result.push(request.id); }
            }, []);
            setTimeout(() => poll(pending), 5000);

        });
    }
}

В вышеприведенном примере не упоминаются clearTimeout и список подписок, которые очищаются при остановке опроса. Я знаю, что это может быть достигнуто с помощью repeatWhen и takeWhile

1 Ответ

0 голосов
/ 05 января 2019

Это поток rxjs, который достигает вашей рекурсии:

callService(ids).pipe(
  expand(reqs => reqs.length === 0
    ? empty()
    : callService(
        reqs.filter(req => req.status === 1).map(req => req.id)
      ).pipe(delay(1000))
  )
).subscribe();

Здесь вы можете увидеть демонстрацию: https://stackblitz.com/edit/rxjs-aaxiru

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