微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

RxJs 轮询作业 - 链接是否正确?

如何解决RxJs 轮询作业 - 链接是否正确?

我无法使其正常工作,如果有人能指出我正在尝试的问题和问题,我将不胜感激。我不确定问题是与 observables 的链接还是其他什么有关。

说明

  1. 文件发布到服务器,该文件立即为此请求发出 ID
  2. 随后通过轮询检查该 id 的处理是否完成
  3. 处理完成后,使用相同id的服务器访问结果

问题: 我看到下面的解决方案继续发布文件而不是发布一次,然后任意地要么逃脱要么得到结果。不用说我做错了什么。

尝试的解决方(此处为示意图,因此请忽略语法等):

  1. 主要的 observable 调用 Post 方法,然后使用从服务器接收到的 id 调用 poll 方法
    this.postData(inputFormData).pipe(
          map(res => {
            console.log(res.message);
            return res.message
          }),catchError(
            err => {
              console.log(err.message);
              this.errorSubject.next(err.message);
              return throwError(err.message);
            }
          ),delay(5000),concatMap((id) => this.pollData(id))
        )

post方法实现很简单

  postData(dataForm: any){
    let headers = this.headers;
    headers.set('Content-Type','multipart/form-data');
    return this.httpClient.post<MessageInterface>(this.endPoint,dataForm,{headers: headers})
  }
  1. PollData observable 以 5 秒的固定间隔运行,并检查服务器是否完成状态。如果状态完成,则调用 Get 方法并从服务器检索结果
      pollData(id: string){
        return timer(0,5000)
        .pipe(
          switchMap( () => {
            console.log(id);
            return this.checkStatus(id)
          }),map(res => res.message),filter(status => status === 'completed'),take(1),timeout(100000),concatMap(() => this.getData(id)),catchError(err => throwError(err))
        )
      }

checkStatus 很简单

  checkStatus(id: string){
    console.log(id);
    return this.httpClient.get<MessageInterface>(this.endPointMain + `/status/${id}`,{headers: this.headers})
  }

3 Get 数据方法很简单,使用 id 来获取

  getData(id: string){
    return this.httpClient.get(this.endPointMain + `/results/${id}`,{headers: this.headers,observe: 'response',responseType: 'blob'})
  }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。