我有以下用例:
有一项服务使用特定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
。
答案 0 :(得分:0)
您需要将服务调用包装在一个可监视一系列服务调用的observable中。服务呼叫将始终发出单个值并完成。
看看这个stackblitz:https://stackblitz.com/edit/typescript-dwmwls?file=index.ts
但有一条评论:你应该小心first(predicate)
- 即使它完成了这项工作,如果没有发出满足谓词的值,它将在完成时抛出错误。否则,您可以使用filter(predicate)
+ take(1)
。
如果您将first
替换为skipWhile
+ take(1)
- 您也应该做得很好。通常有两种方法可以在rxjs中实现相同的结果。