在 nestjs 中重试 rxjs


import { HttpService, Injectable } from '@nestjs/common';
import { retry } from 'rxjs/operators';
@Injectable()
export class XXXService {
constructor(private http: HttpService) {}
predictAll() {
return this.http
.post('https://xxxxx/xxxxx')
.pipe(retry(5));
}
}

那么我有以下代码从上面的可观察对象订阅

import { Inject, Injectable } from '@nestjs/common';
import { XXXService } from '@api/services/XXX.service';
@Injectable()
export class YYYService {
constructor(
private readonly xxxService: XXXService
) {
this.predictAll();
}
async predictAll() {
await this.xxxService.predictAll().subscribe(
({ data }) => {
console.log(data);
},
err => {
console.log('error');
}
);
}
}

然后我尝试关闭我的互联网连接,检查后,"错误"仅在控制台中打印一次,这意味着我的可观察对象根本没有重试。我做错了什么吗。

重试

的预期行为让您感到困惑。

使用retry运算符,它不会将错误转发到错误处理程序,直到所有重试尝试都用尽。所以它正在重试,只是您的期望与如何记录错误有关。如果要在重试之前记录错误,则需要使用tapretry之前产生副作用:

source$.pipe(
tap({ error: err => console.log('error: ', err.message) }),
retry(5),
)
.subscribe({
next: value => console.log(value),
error: err => console.log('only fires once ', err.message),
});

不相关:你正在用async/await在那里做一些奇怪的事情。

另外,await source$.subscribe()没有意义,因为这样做,您的函数只会返回Promise<Subscription>subscribe不返回Promise。您可能正在寻找Observable.prototype.forEach()但是,请注意,使用它将放弃取消,因为它不会返回要取消订阅的Subscription

在这种情况下,我建议不要使用async/await

我希望这有所帮助。

最新更新