【发布时间】:2017-03-22 04:56:03
【问题描述】:
假设我有一个ValuesComponent,它在 HTML 表格中显示Value 的数组。
// in value.ts
export class Value { ... }
// in values.component.ts
@Component(...)
export class ValuesComponent { ... }
作为一个优秀的程序员,我创建了一个不同的类来负责提供值。我们称之为ValuesService。
// in values.service.ts
@Injectable()
export class ValuesService
{
public getValues(): Observable<Value[]>
{
...
}
}
假设服务从 Web 服务获取其值:/api/values
现在我不想将服务直接注入到我的组件中,而是让 Angular 路由器在导航到组件之前预取值。
为此,我创建了一个Resolve 服务类并将其插入路由器模块。
// in values-resolver.service.ts
export class ValuesResolverService implements Resolve<Value[]> {
constructor(private backend: ValuesService) {
}
public resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<Value[]> {
return this.backend.getValues();
}
}
// In app.module.ts (in @NgModule())
imports: [
RouterModule.forRoot([{
path: 'values',
component: ValuesComponent,
resolve: { values: ValuesResolverService }
}])
]
// In values.component.ts
public values: Value[];
constructor(private route: ActivatedRoute) {
}
ngOnInit() {
this.values = route.data.values as Value[];
}
到目前为止我做得怎么样?好的?那么当ValuesService.getValues() 失败时,我应该在哪里进行错误处理? (连接错误,内部服务器错误,...)
当用户尝试导航到/#/values 路由并发生错误时,我想将错误记录到控制台并停止导航。理想情况下,我想将用户重定向到 /#/error 路由(示例代码中未显示)。
【问题讨论】:
-
这个问题没有提到错误应该发生什么。
-
一个简单的
console.log就可以了。我只需要知道将它放在哪里以及返回什么(如果有的话)。 -
那么问题是关于可观察对象,而不是解析器。这是
return this.backend.getValues().catch(...)。 -
显然,您可能已经想到了这一点,但您可能需要从解析器返回
Promise、Observable或其他一些单子抽象,而不是值数组本身。这样,您可以在解析器中附加错误处理,并且通过将路由器也注入其中,您可以在.catch中触发导航。实际上,看起来您正在返回一个Observable<Value[]>,因此您可以在对ValuesService的调用中附加错误处理,然后在 catch 块中重定向。我认为这会奏效。 -
@AluanHaddad 我没想到。您应该将您的评论转换为答案。
标签: angular typescript rxjs