我在Angular2中创建了一个服务,它负责对Java服务进行REST调用,并使用HTTP Observable获取产品数组。
getAll(): Observable<Product[]>{
let data$ = this.http
.get(`${this.baseUrl}/productdata`, {headers: this.getHeaders()})
.map(mapData)
.catch(handleError);
console.log(' object array:' , data$)
return data$;
}
然后我在我的组件中为此Observable编写了一个订阅者,并将其放在ngOnInit()方法中,并且只想提取第一个放置在ngOnInit()内的产品。
this.product = this.products [0];
ngOnInit() {
this.productService
.getAll()
.subscribe(
/* happy path */ p => this.products = p,
/* error path */ e => this.errorMessage = e,
/* onComplete */ () => this.isLoading = false);
this.product = this.products[0];
}
但由于Observable的异步行为,OnInit方法中的最后一个操作导致 produc t未定义。同样,我无法使用产品的属性在HTML组件中进行插值。 我希望提取是自动的。那么你能为我提供一种方法吗?
答案 0 :(得分:1)
你实际上回答了自己的问题 - 因为它是异步的,你立即调用this.product = ...
,而observable需要一些时间才能返回。解决方案很简单:
ngOnInit() {
this.productService
.getAll()
.subscribe(
/* happy path */ p => {
this.products = p;
this.product = this.products[0];
},
/* error path */ e => this.errorMessage = e,
/* onComplete */ () => this.isLoading = false);
}
在可观察回调中包含该集合。
答案 1 :(得分:0)
您的代码:
this.product = this.products[0];
在定义之前正在执行。将其移至您的成功功能
this.productService
.getAll()
.subscribe(
/* happy path */ p => {
this.products = p;
this.product = this.products[0];
},
/* error path */ e => this.errorMessage = e,
/* onComplete */ () => this.isLoading = false
);
答案 2 :(得分:0)
由于您正在使用observable,您可以利用可观察的所有方法,例如您已经使用的.map()函数。
this.productService
.getAll()
.map(products => products[0])
.subscribe(
/* happy path */ product => this.product = product,
/* error path */ e => this.errorMessage = e,
/* onComplete */ () => this.isLoading = false
);