[英]Return result directly from http (observable) service (function) without returning Observable
直接从服务返回结果的方法是什么,而不是返回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;}
)
}
}
调用 function 时(返回 null,也带有async-await
)
@Component()
export class SomeComponent implements OnInit {
constructor(private service:SomeService) {}
ngOnInit() {
let data = this.service.GetDataEitherFromApiOrFromLocalStotage();
}
}
更新
我尝试这样做的原因是因为我想将所有逻辑放在服务中,而不是在组件中。
你可以尝试这样的事情:
我已经包含了 promise 路线(在底部)和可观察路线
在服务中隔离您的 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() 还需要返回一个 observable:
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;
});
}
}
最后 - 如果promise是您的要求,那么您可以随时执行此操作并推出自己的 promise。 这将允许您调用,但是我不鼓励这样做并建议使用可观察模式:
GetDataEitherFromApiOrFromLocalStorage(): Promise<any> {
return new Promise((resolve, reject) => {
this.http.get("https://" + this.url + "/api/main/apidata").subscribe(
(next) => { resolve(next); },
(error) => { reject(error); }
);
});
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.