繁体   English   中英

直接从 http (observable) 服务(函数)返回结果而不返回 Observable

[英]Return result directly from http (observable) service (function) without returning Observable

直接从服务返回结果的方法是什么,而不是返回Observable然后使用then子句。 我搜索了很多东西,例如使用pipeoftaketoPromisemapasync-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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM