我有一部分代码不能像我想要的那样工作。
challengeService.getChallenge(1,this.navParams.get("val1",val2))
.map(res => res.json())
.catch(err => {
alert('UI error handling');
alert(err);
return Observable.throw(err); // observable needs to be returned or exception raised
})
.subscribe((data) => {
this.challenge = ((data[0]));
});
return this.challenge;
它与我的挑战服务对话,代码在这里:
getChallenge(val1, val2)
{
this.storage.ready().then(() => {
this.storage.get('jwt').then((val) => {
let authHeader = new Headers();
authHeader.append('x-access-token', val);
this.challenges = this.http.get('http://localhost:8080/api/val3/'+val1+'/'+val2+'', {
headers: authHeader
});
});
});
return this.challenges;
}
在我的代码的第一部分中,我现在得到一个映射错误(不能在.defigure上映射。)因为我的challenge数组显然是空的。 当我将return语句放在存储括号中时,程序会唠叨不返回一个数组,但什么都不返回(void)。如何让challengepage等待我的质询服务从api获取数据并正确填充数据?
先谢谢!
答案 0 :(得分:4)
考虑更改http调用的顺序和组织,以便更加严格地遵循常规做法。
如果您没有使用新的HttpClient,那么服务代码通常如下所示:
getProducts(): Observable<IProduct[]> {
return this._http.get(this._productUrl)
.map((response: Response) => <IProduct[]> response.json())
.do(data => console.log('All: ' + JSON.stringify(data)))
.catch(this.handleError);
}
请注意,这是响应映射的位置。 (我知道你在这里需要一些关于你的存储检查的其他代码......但是这显示了经常使用地图的方式。)
组件代码看起来像这样:
ngOnInit(): void {
this._productService.getProducts()
.subscribe(products => this.products = products,
error => this.errorMessage = <any>error);
}
这是处理订阅的地方。