如何根据另一个 Observable 的结果调用一个 Observable 并返回一个 Observable

Bla*_*ing 0 rxjs angular

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

伪代码:

if(serviceRunning()){
  return getUserFromService();
}else{
 return getUserFromLocalResource();
}
Run Code Online (Sandbox Code Playgroud)

我的实际方法(这些都驻留在我的 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');
}
Run Code Online (Sandbox Code Playgroud)

我尝试了无数的 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;
    })
  );
}
Run Code Online (Sandbox Code Playgroud)

Jav*_*SKT 7

您可以用于switchMap此场景

工作堆栈闪电战

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");
  }
}
Run Code Online (Sandbox Code Playgroud)

您可以从另一个方法返回serviceRunning方法,如下所示,您可以订阅主方法(getUsers()),这是您的要求

getUsers() {
  return this.serviceRunning();
}
Run Code Online (Sandbox Code Playgroud)