javascript - 使用 flatMap 链接可观察量

标签 javascript angular rxjs observable chaining

我正在使用可观察量和 flatMap 运算符,我编写了一个方法,该方法进行 API 调用并返回带有对象数组的可观察量。

基本上我需要的是获取对象数组并在处理所有项目后处理每个对象。我想将结果链接起来,以使用我编写的另一个方法进行额外的 API 调用。

以下代码满足我的需要:

  this.apiService.getInformation('api-query', null).first().flatMap((apiData) => {
    return apiData;
  }).subscribe((dataObject) => {
    this.processService.processFirstCall(dataObject);
  }, null, () => {
    this.apiService.getInformation('another-query', null).first().subscribe((anotherQueryData) => {
      this.processService.processSecondCall(anotherQueryData);
    });
  });

但从我的 Angular 来看,这种方法并不是最佳的,我想使用 flatMap 链接这些调用,但如果我执行以下操作:

   this.apiService.getInformation('api-query', null).first().flatMap((apiData) => {
    return apiData;
  }).flatMap((dataObject) => {
    this.processService.processFirstCall(dataObject);
    return [dataObject];
  }).flatMap((value) => {
    return this.apiService.getInformation('another-api-query', null).first();
  }).subscribe((value) => {
    this.processService.processSecondCall(value);
  });

第二个 API 调用针对 apiData 对象数组中的每个项目执行一次。我知道我遗漏或误解了某些东西。但从这个线程的第二个答案Why do we need to use flatMap? ,我认为第二个 flatMap 应该返回处理后的 apiData,而不是返回该数组上的每个对象项。我将不胜感激的帮助。

谢谢。

最佳答案

你想要的是.do()运算符,而不是 flatMap()flatMap() 会将一个事件转换为另一个事件,本质上是将它们链接起来。 .do() 只是对事件中的每次发射执行您指示它执行的任何操作。

从您的代码中,有 2 个异步方法(调用 api)和 2 个同步方法(processService)。你想做的是:

  1. 调用第一个 API(异步),等待结果
  2. 处理结果(同步)
  3. 调用第二个API(异步),等待结果返回
  4. 处理结果(同步)

因此您的代码应该是:

this.apiService.getInformation('api-query', null)//step1
    .first()
    .do((dataObject) => this.processFirstCall(dataObject))//step2
    .flatMap(() => this.apiService.getInformation('another-api-query', null))//step3
    .first()
    .do(value => this.processService.processSecondCall(value))//step4
    .subscribe((value) => {
        console.log(value);
    });

我在评论中写了与上面列表相对应的步骤。我还清理了不必要的运算符(比如你的第一个 flatMap 有点多余)。

此外,如果您想转换数据,则应该使用 .map()而不是 .do()。我认为这就是您与 .map().flatMap() 混淆的地方。

关于javascript - 使用 flatMap 链接可观察量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45355108/

相关文章:

javascript - RXJS。每隔几秒从媒体流中获取值(value)

javascript - 有没有一种方法可以加载模块化 HTML 片段而不必为每个片段触发 http 请求?

Angular 绑定(bind)到函数结果

javascript - 如何在 typescript 中从 Map 获取所有键?

javascript - 恢复到旧版本的 Ionic 2 CLI

javascript - 合并一些异步的可观察序列并保留顺序

javascript - 通过每个索引上的特定属性是否为真来正确过滤对象数组的可观察对象?

javascript - Bootstrap 模式弹出窗口立即打开和关闭

javascript - 当我在严格模式下使用 `===` 运算符时,javascript 中出现比较歧义,有人可以告诉我这是为什么吗?

javascript - 使用Guards(Roles、JWT)获取用户数据