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();
}
}
在上述代码中,我们进行了以下优化:
- 使用
switchMap
来处理异步请求,确保每次轮询都会取消之前的请求,避免可能出现的并发请求问题。 - 使用
finalize
操作符来在轮询结束时执行一些清理操作,例如记录日志。 - 将异步请求的处理逻辑放入
dealProcess
方法中,并返回一个 Observable,以便在其中处理异步请求的返回值,并根据返回值决定是否停止轮询。 - 在
dealProcess
方法中,使用switchMap
来处理异步请求的返回值,并在特定条件下返回一个特定的 Observable 值,以触发停止轮询。 - 在
stopPolling
方法中,确保在停止轮询时取消订阅。 - 上述写法里 请注意
dealProcess
的写法 return;