【问题标题】:How to call an Observable based on outcome of another Observable and return an Observable如何根据另一个 Observable 的结果调用 Observable 并返回一个 Observable
【发布时间】:2021-02-05 01:20:15
【问题描述】:

Angular 10,创建一个返回 Observable 的服务方法(User 是我创建的自定义对象)。我希望添加(一个可观察的)服务方法,它会告诉我服务是否启动并运行,如果没有,我想返回一个不同的 Observable,这个是从本地资源加载的。

伪代码:

if(serviceRunning()){
  return getUserFromService();
}else{
 return getUserFromLocalResource();
}

我的实际方法(这些都驻留在我的 UserService 模块中,并从我的控制器方法中调用):

serviceRunning() {
  // Calls service method serviceRunning which returns boolean.
  return this.http.get<boolean>(this.nodeUserSvcUrl + 'api/serviceRunning');
}

getUser(name: string): Observable<User> {
  if (this.serviceRunning()) { // Pseudo code...this line obviously does not work
    // Return user data from service
    return this.http.get<User>(this.nodeUserSvcUrl + 'api/users/' + name);
  } else {
    // Return data from local resource
    return this.getStaticUser(); 
  }
}

// Get local user data
getStaticUser() {
  return this.http.get<User>(this.usersUrl + 'users.json');
}

我尝试了无数的 mergeMap、forkJoin、concatMap 代码,但都没有奏效。最接近的解决方案与此类似:(Angular4 how to chain forkJoin with flatMap),但他没有返回 Observable - 我需要。因此,我觉得我无法像他的代码那样订阅 forkJoin/concatMap 结果。

任何帮助将不胜感激!

更新: 根据 Sivakumar 在下面的回复,这是我的实际实现,供可能需要的人使用:

getUser() {
  return this.serviceRunning().pipe(
    switchMap(val => {
      var tmp: Observable<User>;
      val ? 
        tmp = this.http.get<User>(this.nodeUserSvcUrl + 'api/users/' + name)
      :
        tmp = this.getStaticUser();
      return tmp;
    })
  );
}

【问题讨论】:

    标签: angular rxjs


    【解决方案1】:

    您可以在这种情况下使用switchMap

    工作Stackblitz

    import { Injectable } from "@angular/core";
    import { of } from "rxjs";
    import { switchMap } from "rxjs/operators";
    
    @Injectable({
      providedIn: "root"
    })
    export class TestService {
      test: boolean = true;
    
      serviceRunning() {
        return of(this.test).pipe(
          switchMap(val =>
            val ? this.getUserFromRemote() : this.getUserFromLocal()
          )
        );
      }
    
      getUserFromRemote() {
        return of("User from Remote");
      }
    
      getUserFromLocal() {
        return of("User from Local");
      }
    }
    

    你可以像下面这样从另一个方法返回serviceRunning方法,你可以订阅main方法(getUsers()),这是你的要求

    getUsers() {
      return this.serviceRunning();
    }
    

    【讨论】:

    • 哦,哇,感谢您的回复,这完全做到了!我什至终于正确理解了 switchMap 现在是如何工作的。非常感谢您的帮助!
    • @BlackFlagRacing 很高兴听到 ;) 你也可以投票吗 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-01
    • 2018-11-21
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多