Ответ 1
В такой ситуации Служба должна обрабатывать ошибку и перенаправлять на требуемый маршрут. Затем метод catch должен возвращать пустой Observable (для разрешения защиты), при обработке пустых случаев в течение разрешения.
Что-то вроде этого
export class ValuesService {
constructor(private http:Http, private router:Router) {}
getValue() {
this.http.get('/some/url').map((response:Response) => {
// Map your response to a model here
}).catch((response:Response) => {
// Handler case for different status
this.router.navigate(['/error']);
return Observable.empty();
})
}
}
И охранник будет выглядеть следующим образом
export class ValueResolveGuard implements Resolve<Value[]> {
constructor(private valueService:ValueService) {}
resolve() { // You don't need the route & state if you're not gonna use them
this.valueService.getValue().toPromise().then((values:Values[]) => {
if (!values) { // For the Observable.empty() case
// return some default stuff
}
return values;
})
}
}
В качестве альтернативы, если вы хотите специально вернуть наблюдаемое (не должно иметь никакого значения в этом случае, так как защита решения принимает как наблюдаемое, так и обещание), вы можете сделать что-то вроде этого.
this.valueService.getValue().first().catch({} => {
// return some default value.
});
Обратите внимание, что first() требуется, чтобы возвращаемый наблюдаемый был завершен наблюдаемым, иначе защита разрешения не решилась. Уловка необходима, потому что вызов first() на пустой наблюдаемый вызовет ошибку.