RxJS skipWhile boolean是真的

时间:2018-06-11 07:05:25

标签: javascript angular typescript rxjs

我有以下用例:

有一项服务使用特定ID对计算任务进行排队。我连接了一个observable来查询服务的状态。只要ID在队列中,查询就会返回true(尚未计算)。查询为false后,表示已计算任务。

我正在寻找一种可能性,只有在返回值为false时,observable才会发出。到目前为止,我已尝试使用.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();
  }

(我很抱歉使用== true / false)

希望有人可以给我一个提示。我正在使用RxJS 6。

修改 对不起我错过了什么。 this.calcService.searchID(id)是HTTP请求。并在每个请求它返回布尔值。所以我可能在20次请求之后或100之后得到false。这取决于服务的计算速度。所以我需要等到false回来,或重做请求,直到我得到false

1 个答案:

答案 0 :(得分:0)

您需要将服务调用包装在一个可监视一系列服务调用的observable中。服务呼叫将始终发出单个值并完成。

看看这个stackblitz:https://stackblitz.com/edit/typescript-dwmwls?file=index.ts

但有一条评论:你应该小心first(predicate) - 即使它完成了这项工作,如果没有发出满足谓词的值,它将在完成时抛出错误。否则,您可以使用filter(predicate) + take(1)

如果您将first替换为skipWhile + take(1) - 您也应该做得很好。通常有两种方法可以在rxjs中实现相同的结果。