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

Angular 9 rxJs-如何使用combine/merge语句检索可观察值并传递给另一个函数

公西天逸
2023-03-14

我有一项服务,让我打开一个小吃吧:

this.snackBarService.open(title, body);

titlebody是字符串。

我遇到的问题是,它们都需要从键进行翻译,翻译服务返回一个可观察的:

  /**
   * Returns an observable for a translation based on the key
   *
   * @param key the translation key
   */
  private getTranslation(key: string): Observable<string> {
    return this.translocoService.selectTranslate(key, {}, 'auth');
  }

这个问题让我想到,在调用open方法之前,我可以使用mergeMapcombinelateest,如下所示:

  this.getTranslation('snackbars.username.success.title').pipe(
    mergeMap(title => {
      return combineLatest(
        of(title),
        this.getTranslation('snackbars.username.success.body')
      );
    }),
    map(([title, body]) => {
      console.log('here', title, body);
      this.snackBarService.open(title, body);
    })
  );

但是什么都没发生...控制台不记录任何东西:(

要订阅和取消订阅getTranslation的两个调用会有点乏味。。。那么,有没有简单的方法从可观测数据中获取值并将其传递到snackbar?

共有1个答案

通寂离
2023-03-14

我相信,只有使用forkJoin,您才能做得足够多。试试下面的方法

forkJoin([
  this.getTranslation('snackbars.username.success.title'), 
  this.getTranslation('snackbars.username.success.body')
]).subscribe(
  response => {
    console.log('here', response[0], response[1]);
    this.snackBarService.open(response[0], response[1]);
  }
);

forkJoin仅当两个可观测项都完成时才发出。如果没有,则可以使用combinelatetest和管道,在take(1)中仅使用从可观察对象发出的第一个值并完成。

combineLatest([
  this.getTranslation('snackbars.username.success.title'), 
  this.getTranslation('snackbars.username.success.body')
]).pipe(
    take(1)
  ).subscribe(
  response => {
    console.log('here', response[0], response[1]);
    this.snackBarService.open(response[0], response[1]);
  }
);
 类似资料:
  • 在一个服务中,我有两个API调用,每个调用都返回一个可观察的,在我的组件中,我有一些条件,如果为true,我必须调用这两个函数,但我需要等待get()调用,这样我就可以使用get调用返回的参数执行post函数。如果为false,我只想用已经定义的参数调用post函数。 服务: 组成部分: 我不想重复帖子调用的代码,或者如果不可能的话,只是不要在另一个订阅()中使用订阅()。我怎么能这么做?没有异步

  • 所以,我试图用discord js和sqlite3做一件事,但在过去的几个小时里,我一直在讨论这个问题,我仍然不知道如何解决它。 因此,我试图获取仅在中可用的数据,但我不知道如何将其传递出去,以便返回预期值。我已经尝试过使用全局变量,把它放在更大的范围内,但我仍然不知道如何做到这一点。 对不起,如果我弄糊涂了,我不习惯一直问问题。 编辑:应该说我正在使用NPMSqlite3模块。https://w

  • 我有一个组件订阅服务中的一个可观察对象。该方法反过来订阅另一个服务中的可观察对象。我想将一个数组从最后一个服务传递回第一个服务,然后第一个服务将该数组传递回组件。更具体地说,该组件调用其本地服务,然后调用一个数据服务,该数据服务通过http客户端访问我的数据库。http客户端正在工作,数据服务将数组返回给本地服务。本地服务接收数组,但我不知道如何将该数组作为可观察对象传递回组件。以下是简短的代码块

  • 使用RxJS如何在观察者上传递新属性?所以基本上我希望道具“customProp”可以被观察到 添加更多的信息-所以基本上,我试图创建一个冷可观察的,其中制片人需要一个道具,应该来自订户 添加用法信息--coldObservable是DB连接函数,customProp是需要在DB上执行的查询

  • 当控制器对DataModel中的String statusText进行更改时,我调用setChanged()&notifyObservers(This.statusText),然后在Display类中调用update(Observable o,Object arg)。 我的问题是,当我有多个字符串用于不同的标签时,我应该如何继续?我的第一个想法是将所有字符串放入一个列表中,然后更新方法看起来如下所

  • 我是selenium初学者,只是想把webDriver传递给另一个类,但没有成功。程序应该打开浏览器(“Google”)并在主类中键入一些单词,在第二个类中应该按下“Google”按钮。 以下是我的主要课程: 这是我想从主驱动程序中使用的类。 当我运行它时,它对我说: 传递:main失败:printOnScreen java.lang.NullPointerException 我做错了什么?谢谢高