Rxjs interval is not polling observable server API 调用
Rxjs interval is not polling observable server API call
我正在尝试轮询对我的后端的 API 调用。这个想法是服务器将发送一个 202 错误,直到它完成处理一个作业,并且在这么多请求之后将 return 一个 200 和一些结果。我不希望错误终止流。 API 调用仅调用一次。
"rxjs": "~6.4.0",
"@angular/core": "~8.2.14"
启动代码:
onSubmit() {
return this.scraperService.postUrl(this.form.value.url)
.pipe(
switchMap( val => {
return this.scraperService.pollUntilTaskFinished(val);
})
).subscribe( val => console.log(val))
}
服务代码:
postUrl(url: string): Observable<any> {
return this.http.post('/api/start', {url})
.pipe(
map((res: { jobId: string }) => {
if (res.jobId) {
return res.jobId;
}
}));
}
pollUntilTaskFinished(jobId): Observable<any> {
return interval(2000)
.pipe(
switchMap(() => this.http.get(`/api/results/${jobId}`)))
.pipe(
catchError(err => this.handleError(err)),
map(res => console.log(res)));
}
handleError(data: HttpErrorResponse) {
if (data.status === 202) {
return of('continue');
}
}
如何确保间隔重复,直到我得到 200 和我需要的 JSON?
如果您不想处置链,则必须在错误传播到主链之前捕获错误。这意味着在 switchMap()
:
中捕获它
this.http.get(`/api/results/${jobId}`))
.pipe(
catchError(err => this.handleError(err)),
)
我正在尝试轮询对我的后端的 API 调用。这个想法是服务器将发送一个 202 错误,直到它完成处理一个作业,并且在这么多请求之后将 return 一个 200 和一些结果。我不希望错误终止流。 API 调用仅调用一次。
"rxjs": "~6.4.0", "@angular/core": "~8.2.14"
启动代码:
onSubmit() {
return this.scraperService.postUrl(this.form.value.url)
.pipe(
switchMap( val => {
return this.scraperService.pollUntilTaskFinished(val);
})
).subscribe( val => console.log(val))
}
服务代码:
postUrl(url: string): Observable<any> {
return this.http.post('/api/start', {url})
.pipe(
map((res: { jobId: string }) => {
if (res.jobId) {
return res.jobId;
}
}));
}
pollUntilTaskFinished(jobId): Observable<any> {
return interval(2000)
.pipe(
switchMap(() => this.http.get(`/api/results/${jobId}`)))
.pipe(
catchError(err => this.handleError(err)),
map(res => console.log(res)));
}
handleError(data: HttpErrorResponse) {
if (data.status === 202) {
return of('continue');
}
}
如何确保间隔重复,直到我得到 200 和我需要的 JSON?
如果您不想处置链,则必须在错误传播到主链之前捕获错误。这意味着在 switchMap()
:
this.http.get(`/api/results/${jobId}`))
.pipe(
catchError(err => this.handleError(err)),
)