直接从服务中返回结果而不返回Observable
,然后使用then
子句的方式是什么。
我搜索了很多东西,例如使用pipe
,of
,take
,toPromise
,map
,async-await
,但没有一个返回结果在服务电话上。另外,某些条款在 rxjs 的当前版本中不可用。你能帮忙吗?
注意,我这里有条件,如果api无法正常工作,我可以从本地获取。
@Injectable()
export class SomeService {
GetDataEitherFromApiOrFromLocalStotage():Any
{
let result;
this.http.get("https://"+ this.url +"/api/main/apidata").subscribe(
next=>{result=next;},
error => {result=this.localdata();},
()=>{return result;}
)
}
}
在调用函数时(该函数返回null,也返回async-await
)
@Component()
export class SomeComponent implements OnInit {
constructor(private service:SomeService) {}
ngOnInit() {
let data = this.service.GetDataEitherFromApiOrFromLocalStotage();
}
}
更新
我要这样做的原因是因为我想将所有逻辑都放在服务中,而不是组件中。
答案 0 :(得分:3)
您可以尝试这样的事情:
我在底部同时包括了承诺路线和可观察路线
在服务中隔离您的api /数据工程-组件不必关心如何获得它。
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()将返回真实错误(如果是致命错误),或者将其返回本地(如果预期错误)。
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');
}
最后,在您的组件中,您要做的就是subscribe()并等待数据返回:
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); }
);
});
}