我有一些带有一些属性的服务,这些属性在任何组件加载之前被初始化(它们用作其他http调用的参数)。 Route CanActivate方法用于调用以下方法,该方法应在属性初始化后检索true,否则在出错时检索false。我收到编译错误:声明类型既不是' void'也没有任何'必须返回一个值。我怎么能避免这个错误?
public setupSession(): boolean {
this._http.get('myservice_url')
.map (
(response: Response) => <any>response.json())
.subscribe (
data => {
this.property1 = data.property1;
this.property2 = data.property2;
return true;
},
err => {
console.error(err)
return false;
}
)
}
修改: @K。 Daniek感谢您的帮助!我在本文link的帮助下找到了解决方案。现在,我可以确保在任何其他http呼叫之前完成设置。
服务方法:
public setupSession(): Promise<any> {
var observable = this._http.get('myservice_url')
.map((response: Response) => {
var res = response.json();
return res;
});
observable.subscribe(data => {
this.property1 = data.property1;
this.property2 = data.property2;
});
return observable.toPromise();
}
canActivate方法:
canActivate() {
return this._sessionService.setupSession().then(() => {
return true;
});
}
答案 0 :(得分:0)
我没有看到将此函数的类型声明为布尔值的观点,特别是当此函数的返回实际上是数据时,而不是布尔值。
请尝试以下代码:
public setupSession() {
this._http.get('myservice_url')
.map(
(response: Response) => <any>response.json())
.subscribe(
data => {
this.property1 = data.property1;
this.property2 = data.property2;
},
err => {
console.error(err);
}
)
}
编辑:我正在测试你的代码并且意识到实际上可以使这个函数工作,但是你必须在subscribe
方法之后返回一个布尔值。重构的代码看起来像:
public setupSession(): boolean {
this._http.get('myservice_url')
.map(
(response: Response) => <any>response.json())
.subscribe(
data => {
this.property1 = data.property1;
this.property2 = data.property2;
},
err => {
console.error(err);
});
return true;
}
现在你的http请求函数返回一个布尔值,编译器不会抛出任何错误。
<强> EDIT2 强>:
监听,如果您希望此函数为boolean
类型,则必须在调用该函数后返回boolean
值。由于这个调用是异步的,因此该函数继续执行其他任务,并且不会等待异步响应。这就是为什么函数将始终返回true
(在此特定情况下),甚至在返回success
或error
响应之前。
如果您希望函数在成功时返回true
或在出现错误时返回false
,请使用以下代码:
public setupSession() {
this.http.get(`myservice_url`)
.map(data => data.json())
.subscribe(data => {
this.property1 = data.property1;
this.property2 = data.property2;
console.log('works');
return true;
},
err => {
console.error(err);
console.log('error);
return false;
});
}