我正在尝试编写一种方法,该方法将轮询API操作的状态,返回一个可观察到的对象,该对象将发出每个状态调用的结果(因为它包含我要显示的进度信息),直到完成为止状态,发出该状态,然后完成。
到目前为止,我所拥有的是:
pollStatus(identifier: string): Observable<OperationStatusResource> {
const obs = interval(1000)
.pipe(
startWith(0),
switchMap( () => this.apiService.operationStatus(identifier) ),
takeWhile( (value, index) => {
return value.status != OPERATION_STATUS.COMPLETE;
}, true)
)
return obs;
}
该方法有效,并且我理解它,但是我认为我可以做得更好,而且我还在努力寻找方法。这每秒请求一个新状态,如果尚未完成,则取消上一个状态。我确实想在每次发送新请求时都取消以前的请求,以确保我永远不会由于互联网的恶作剧而出事,但是:
如果响应需要花一些时间,但我也很乐意实现耐心的相同想法,但不愿永远等待,如果响应迅速返回,也不会要求太快。
如果我可以添加整体故障条件或超时,例如放弃,如果连续3次超时,或者整个过程耗时超过5分钟,或者如果连续3次返回非200代码,则奖励积分。] >
我正在尝试编写一种方法,该方法将轮询API操作的状态,并返回一个可观察的对象,该对象将发出每个状态调用的结果(因为它包含我会提供的进度信息...
在睡觉之后,我认为THIS答案加上最后的重试是我应该使用的。