Angular项目中用rjxs写一个包含异步请求的轮询

import { Subscription, interval, Subject, of, Observable, delay } from 'rxjs';
import { takeUntil, switchMap, finalize } from 'rxjs/operators';

 
private timerSubscription: Subscription | null = null;

startPolling() {
  this.timerSubscription = interval(1000)
    .pipe(
      switchMap(() => this.dealProcess()),
      takeUntil(this.stopPolling$),
      finalize(() => {
        console.log('Polling stopped.');
      })
    )
    .subscribe((result) => {
      if (result === 100) {
        this.stopPolling$.next();
      }
      // 处理返回的结果
    });
}

dealProcess() {
  return this.chatRequestService.getProcess({ audio: this.file.name })
    .pipe(
      switchMap((response: any) => {
        if (response) {
          this.processObj.process = response.process >= 1 ? 1 * 100 : response.process * 100;
          if (response.process === 1) {
            this.showInputLoading = false;
            let name = this.file.name.slice(0, this.file.name.lastIndexOf('.')) + '.vtt';
            this.showVttFile(name);
            this.previewAudio(this.file);
            console.log('Process is done. Stopped polling.');
            return of(100); // 返回一个 Observable 以触发停止轮询
          } else {
            console.log('Process is still in progress. Continuing polling...');
            return of(response.process);
          }
        } else {
          console.log('Error in process response. Stopped polling.');
          return of(-1); // 返回一个 Observable 以触发停止轮询
        }
      })
    );
}

stopPolling() {
  if (this.timerSubscription) {
    this.timerSubscription.unsubscribe();
  }
}

在上述代码中,我们进行了以下优化:

  1. 使用 switchMap 来处理异步请求,确保每次轮询都会取消之前的请求,避免可能出现的并发请求问题。
  2. 使用 finalize 操作符来在轮询结束时执行一些清理操作,例如记录日志。
  3. 将异步请求的处理逻辑放入 dealProcess 方法中,并返回一个 Observable,以便在其中处理异步请求的返回值,并根据返回值决定是否停止轮询。
  4. 在 dealProcess 方法中,使用 switchMap 来处理异步请求的返回值,并在特定条件下返回一个特定的 Observable 值,以触发停止轮询。
  5. 在 stopPolling 方法中,确保在停止轮询时取消订阅。
  6. 上述写法里 请注意dealProcess 的写法 return;
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值