【发布时间】:2019-07-10 08:15:35
【问题描述】:
在我的 Angular 7 项目中,作为组件初始化的一部分,我正在运行一系列 HTTP 请求。每次请求后,我都会收到响应,然后运行下一个请求。
目前我已将 HTTP 请求放入服务并从我的组件中调用它们。我的 HTTP 请求函数应用了额外的 RXJS 函数,包括超时和通过 .pipe 函数重复请求。错误处理在组件中完成。
要链接,在一个请求完成后,我会在另一个函数中调用下一个请求。我将需要第一个请求的响应数据来执行下一个响应。
问题是我当前的链接方式看起来非常混乱且难以遵循。
有没有更好的方法来链接 HTTP 请求?
我知道有一个 rxjs fork 函数,但对如何实现它有点困惑,尤其是当我有错误处理和管道时。
注意:错误的处理方式与请求相同。
完整代码如下,提前致谢。
Component
formData: any;
style: any;
subscribers:any[];
constructor(private webService: WebService){}
ngOnInit(){
let id: number = 1;
this.getFormData(id);
}
getFormData(id: number) {
this.webService.getFormData(id)
.subscribe(
data => {
this.formData = data;
this.getFormStyle(this.formData.style_id);
},
err => {
// Error handler
}
)
}
getFormStyle(id: number) {
this.webService.getFormStyle(id)
.subscribe(
data => {
this.style = data;
this.getFormSubscribers(this.formData.subscriber_id);
},
err => {
// Error handler
}
)
}
getFormSubscribers(id: number) {
this.webService.getFormSubscribers(id)
.subscribe(
data => {
this.subscribers = data;
},
err => {
// Error handler
}
)
}
网络服务
表单数据 API
getFormData(id: number): any {
let headers: any = this.headerService.getHeaders();
return this.http.get('www.test.com/form/data/' + id, {headers: headers})
.pipe(timeout(25000))
.pipe(retryWhen(errors => errors
.pipe(map((err, index) => {
// No Error, throw immediately
if (!err) {
throw err;
}
// Caught error (ie not disconnected), throw immediately
if (err.status !== 0) {
throw err;
}
// Disconnection repeat to limit
if (index === 2) {
throw err;
}
return err;
}))
.pipe(delay(2000))))
.pipe(map(res => res.json()))
}
表单样式 API
getFormStyle(style_id:number) {
let headers: any = this.headerService.getHeaders();
return this.http.get('www.test.com/form/style/' + style_id, {headers: headers})
.pipe(timeout(25000))
.pipe(retryWhen(errors => errors
.pipe(map((err, index) => {
// No Error, throw immediately
if (!err) {
throw err;
}
// Caught error (ie not disconnected), throw immediately
if (err.status !== 0) {
throw err;
}
// Disconnection repeat to limit
if (index === 2) {
throw err;
}
return err;
}))
.pipe(delay(2000))))
.pipe(map(res => res.json()))
}
表单订阅者 API
getFormSubscribers(subscriber_id:number) {
let headers: any = this.headerService.getHeaders();
return this.http.get('www.test.com/form/subscribers/' + subscriber_id, {headers: headers})
.pipe(timeout(25000))
.pipe(retryWhen(errors => errors
.pipe(map((err, index) => {
// No Error, throw immediately
if (!err) {
throw err;
}
// Caught error (ie not disconnected), throw immediately
if (err.status !== 0) {
throw err;
}
// Disconnection repeat to limit
if (index === 2) {
throw err;
}
return err;
}))
.pipe(delay(2000))))
.pipe(map(res => res.json()))
}
【问题讨论】:
-
您使用什么来进行 API 调用。
Http或HttpClient。看起来您正在使用Http,这没有意义,因为您还使用了 Rxjs 5.5 之后出现的现代 Rxjs 语法,但在此之前已弃用Http。所以只想确认一下。是Http还是HttpClient? -
当您需要前一个值时,使用 switchMap 链接可观察对象。 learnrxjs.io/operators/transformation/switchmap.html
-
我正在使用 Angular Http,但不知道它已被弃用:import { Http } from '@angular/http';