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
运算符,它不会将错误转发到错误处理程序,直到所有重试尝试都用尽。所以它正在重试,只是您的期望与如何记录错误有关。如果要在重试之前记录错误,则需要使用tap
在retry
之前产生副作用:
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
。
我希望这有所帮助。