typescript - RxJS - 每 3 秒查询一次服务器,持续 15 秒或正结果

标签 typescript rxjs

我想每 3 秒查询一次服务器,直到收到正返回或 15 秒过去。这是我的代码,但它不起作用:

service.ts

getStatus(id: number): Observable<Status> {
    return 
        from(this.webSvc.getStatus(id))
            .pipe(
                 throttleTime(3000),
                 mergeMap((result: Status) => {
                     if (result.IsProcessed) {
                          return of(result);
                     }

                     return throwError(null);
                 }),
                 retry(5) // I assume, that 5 retries * 3sec throttle time = 15 seconds
           );
}

Controller .ts

service.getStatus(item.id)
    .subscribe(
        (status: Status) => {
            // some logic
        },
        error => {
            // error logic
        }
    );

最佳答案

我会执行以下操作:

defer(() => yourRequest()).pipe(
  retryWhen(obs$ => obs$.pipe(delay(3000))),
  timeout(15000)
);

这是一个现场演示:https://stackblitz.com/edit/rxjs-ssanxj?file=index.ts

解释一下发生了什么:

  • 它会立即发出请求并等待答案或错误
  • 如果出现错误,它将等待 3 秒,然后重试请求
  • 如果事情持续失败,15 秒后超时将引发错误
  • 一旦一切顺利,我们就会收到回复并停止投票

关于typescript - RxJS - 每 3 秒查询一次服务器,持续 15 秒或正结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60037364/

相关文章:

angular - 在组件之间共享动态创建的 observable

javascript - 如何合并多个 observable、RxJS 的结果?

angular - ngrx 效果中的 switchMap 取消选项 http 请求

rxjs - 当 observable 完成时,我应该如何发出单个值?

typescript - 接口(interface)签名不匹配

Angular 单元测试不初始化 ag-Grid

typescript - 需要在 KeyboardAvoidingView 中单击两次,即使 Keyboardshouldpersisttaps 始终为

typescript - 如何为 chalk 的标记模板文字定义 TypeScript 类型?

javascript - 为什么我必须为常规 "const"变量指定类型,而不是为 "const"循环中定义的 "for"变量指定类型?

angular - 使用来自 Observable 的 startWith 创建 Observable