当前位置: 首页 > 知识库问答 >
问题:

RXJS-Angular:如何等待一个可观察的函数,调用另一个返回可观察的函数?

公良扬
2023-03-14

在一个服务中,我有两个API调用,每个调用都返回一个可观察的,在我的组件中,我有一些条件,如果为true,我必须调用这两个函数,但我需要等待get()调用,这样我就可以使用get调用返回的参数执行post函数。如果为false,我只想用已经定义的参数调用post函数。

服务:

  get(id: string) {
    return this.http.get<any>('get path');
  }

  post(data: data) {
    return this.http.post<any>('post path', {data: data});
  }

组成部分:

  execute() {
    if (condition) {
      this.service.get(id).subscribe( (res) =>
        // ...
        this.data = res.data;
        post(data).subscribe(() => // do stuff...);
      );
    } else { post(data).subscribe(() => // do stuff...); }
   }

我不想重复帖子调用的代码,或者如果不可能的话,只是不要在另一个订阅()中使用订阅()。我怎么能这么做?没有异步等待。

提前谢谢

共有2个答案

东门彬
2023-03-14

另一个解决方案可能如下所示:

const source$ = condition
  ? this.service.get(id) // Get new data
  : of(this.data); // Use already defined data

source$.pipe(
  concatMap(data => this.service.post(data)), 
)
窦宏旷
2023-03-14

您可以使用RxJSswitchMap操作符从一个可观察对象映射到另一个可观察对象(在您的例子中是GET to POST),并使用RxJSiif函数有条件地返回一个可观察对象。

试试下面的方法

js prettyprint-override">execute() {
  const getPost$ = this.service.get(id).pipe(
    switchMap((res: any) => {
      this.data = res.data;
      return this.service.post(data);
    })
  );


  iif(
    () => condition,
    getPost$,
    this.service.post(data)
  ).subscribe(
    (res: any) => { 
      // handle response
    },
    (error: any) => {
      // handle error
    }
  );
}
 类似资料:
  • 我有一个组件订阅服务中的一个可观察对象。该方法反过来订阅另一个服务中的可观察对象。我想将一个数组从最后一个服务传递回第一个服务,然后第一个服务将该数组传递回组件。更具体地说,该组件调用其本地服务,然后调用一个数据服务,该数据服务通过http客户端访问我的数据库。http客户端正在工作,数据服务将数组返回给本地服务。本地服务接收数组,但我不知道如何将该数组作为可观察对象传递回组件。以下是简短的代码块

  • 函数应该从get请求返回一个 在这种情况下,我只能在为真时执行请求,否则我在函数

  • 我有这个问题,我一直在寻找,但找不到解决方案(或者也许我不能根据其他答案做出解决方案)。 我的问题是,我需要找到一种方法来等待可观察的(有自己的订户)并等待另一个可观察的(有自己的订户)完成。 场景是这样的: 奥布1- 奥布斯2 - 我主要担心的是我需要两个订阅者。在我看来,obs1 和 obs2 并行运行,但需要检查 obs1 是否以新的会话令牌完成。也许这不是RxJava的主要目的。 Obs1

  • 问题是 我有一个活动,它定期从API获取数据并显示收到的数据。API 使用 OAuth,因此我会收到一个临时访问令牌,该令牌在一段时间(1 小时)后过期。如果应用尝试使用过期的令牌获取数据,则显然请求将失败。在我的应用的早期迭代中,我对网络请求使用 AsyncTasks,基本上只是执行了一个新的异步任务,该任务将在调用从服务器获取数据的主异步任务之前获取新的访问令牌。这工作得很好,因为主要的Asy

  • 我对Observables和RxJs是新手,我想对回报进行调整。如果第一个选择器返回某个值,我希望第二个选择器可以观察到。但是如果第一个选择器没有返回那个特定的值,我想返回false,而不是(false)。我已经走了这么远,但这返回了一个可观察的结果

  • 有人能向我解释一下为什么运算符可以接受返回或的函数吗? 官方文件说: FlatMap运算符通过将您指定的函数应用于源可观察对象发出的每个项目来转换可观察对象,其中该函数返回本身发出项目的可观察对象。 为什么它也可以返回数组? 例如,它们都是有效的: 但这不起作用: