RxJS пропустить, пока булево верно - PullRequest
0 голосов
/ 11 июня 2018

У меня есть следующий сценарий использования:

Существует служба, которая ставит в очередь задачи вычисления с определенным идентификатором.Я подключил наблюдаемое к запросу о статусе сервиса.Пока идентификатор находится в очереди, запрос возвращает true (еще не рассчитано).Как только запрос равен false, это означает, что задача была рассчитана.

Я ищу возможность для наблюдаемого излучать только тогда, когда возвращаемое значение равно false.До сих пор я пробовал с .skipWhile и .filter, но не смог добиться желаемого поведения.

private calc = new Subject<T>();

calculate(id: number): Observable<T> {
    this.calcService.searchID(id).filter((x: boolean) => x == false)
         .subscribe((dat: boolean) => {
              this.calc.next(T);
    });
    return this.calc.share();
  }

или

calculate(id: number): Observable<T> {
    this.calcService.searchID(id).skipWhile((x: boolean) => x == true)
         .subscribe((dat: boolean) => {
              this.calc.next(T);
    });

    return this.calc.share();
  }

(извините за использование ==правда / ложь)

Надеюсь, кто-нибудь может дать мне подсказку.Я использую RxJS 6.

Редактировать: Извините, я что-то пропустил.this.calcService.searchID(id) - это HTTP-запрос.И при каждом запросе возвращает логическое значение.Таким образом, я могу получить false после 20 запросов или после 100. Это зависит от сервиса, насколько быстро выполняется расчет.Поэтому мне нужна возможность либо дождаться возвращения false, либо повторить запрос до получения false.

.

1 Ответ

0 голосов
/ 11 июня 2018

Вам нужно обернуть служебные вызовы в наблюдаемую, которая будет следить за серией служебных вызовов.Сервисный вызов всегда выдаст одно значение и завершится.

Посмотрите на этот стек: https://stackblitz.com/edit/typescript-dwmwls?file=index.ts

Один комментарий, хотя: вы должны быть осторожны с first(predicate) - даже если это делает работу, он выдаст ошибку при завершении, если не было получено значение, удовлетворяющее предикату.В противном случае вы можете использовать filter(predicate) + take(1).

Если вы замените first на skipWhile + take(1) - у вас тоже все будет хорошо.Часто есть несколько способов добиться того же результата в rxjs.

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