直接从http(可观察)服务(函数)返回结果,而不返回Observable

时间:2019-10-15 13:42:46

标签: angular typescript http rxjs 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;}
    )
  }
}

在调用函数时(该函数返回null,也返回async-await

@Component()
export class SomeComponent implements OnInit {

  constructor(private service:SomeService) {}

  ngOnInit() {
   let data = this.service.GetDataEitherFromApiOrFromLocalStotage();
  }
}

更新

我要这样做的原因是因为我想将所有逻辑都放在服务中,而不是组件中。

1 个答案:

答案 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); }
        );
    });
}