Вы можете попробовать что-то вроде этого:
Я включил как маршрут обещания (внизу), так и наблюдаемый маршрут
Изолировать вашAPI / Data Engineering в сервисе - компоненты не должны заботиться о том, как вы его получите.
GetDataEitherFromApiOrFromLocalStorage(): Observable<any> {
return this.http.get('https://' + this.url + '/api/main/apidata').pipe(
catchError((error) => {
// Evaluate if error is fatal or expected
errorIsNotFatal = true;
if (errorIsNotFatal) {
return this.localdata(); // this should return an observable;
}
return throwError(error);
})
);
}
Обратите внимание на эту часть: catchError () либо вернет истинную ошибку (еслиэто фатально) или получить его из local, если ожидается ошибка.
catchError((error) => {
// Evaluate if error is fatal or expected
errorIsNotFatal = true;
if (errorIsNotFatal) {
return this.localdata(); // this should return an observable;
}
return throwError(error);
})
Для того, чтобы это работало, localData () также должна возвращать наблюдаемое:
localdata(): Observable<any> {
return of('anything or any kind of data');
}
Наконец, в вашем компоненте все, что вам нужно сделать, это подписаться () и дождаться возвращения данных:
export class SomeComponent implements OnInit {
public data: any;
constructor(private service: SomeService) {
}
ngOnInit() {
this.service.GetDataEitherFromApiOrFromLocalStorage().subscribe((response) => {
this.data = response;
});
}
}
НАКОНЕЦ - Если ваше требование - это обещание, вы всегда можете сделать это и выполнить свое собственное обещание. Это позволит вам затем позвонить, однако я бы не одобрил это и предложил вместо этого использовать наблюдаемый шаблон:
GetDataEitherFromApiOrFromLocalStorage(): Promise<any> {
return new Promise((resolve, reject) => {
this.http.get("https://" + this.url + "/api/main/apidata").subscribe(
(next) => { resolve(next); },
(error) => { reject(error); }
);
});
}