【问题标题】:Why is it returned when trying to execute the request Observable?为什么在尝试执行请求 Observable 时返回?
【发布时间】:2021-06-07 07:23:34
【问题描述】:

我是 rxjs 的新手,正在尝试做两个请求。当我尝试查看结果时,我得到了 Observable。

copy() {
    const obj = {};

    this.create(skill)
      .pipe(
        mergeMap((res) => {
          return [res, forkJoin(this.levels.map((level) => this.level(level)))];
        }),
      )
      .subscribe((res) => {
        console.log(res);
      });
  }

level(level) {
    return this.create(level);
  }

输出: 创造技能的对象, 可观察的 {_isScalar: false, _subscribe: ƒ}

我正常收到第一个请求的响应,而第二个请求以“可观察”的形式出现。

【问题讨论】:

  • 你能澄清你的问题吗? “第一次请求”/“第二次请求”是什么意思?
  • @BizzyBob,我需要从第一个请求 (this.create(skill)) 中获取答案,并在第二个请求 (this.level(level)) 中使用它。也在订阅中接收第一个请求和第二个请求的响应。
  • 您需要来自第一个请求的数据才能发出第二个请求?
  • @BizzyBob,是的,并在订阅中获得这两个响应

标签: javascript angular typescript rxjs rxjs-observables


【解决方案1】:

我不完全确定我理解你想要做什么:-)

你传递给mergeMap() 的函数应该“通常”返回一个 observable。目前,您正在返回一个数组。

  • 当您返回array 时,mergeMap 将简单地发出每个数组元素;这就是为什么您会收到created skillObservable 这两个发射。
  • 但是,如果您返回 ObservablemergeMap 将订阅它并发出。

我认为这可能适合你:

copy() {
  this.create(skill).pipe(
    mergeMap(createdSkill => forkJoin(this.levels.map(l => this.level(l))).pipe(
      map(createdLevels => ([createdSkill, createdLevels]))  
    )
  )
  .subscribe(
    ([skill, levels]) => console.log({skill, levels})
  );
}

如果我们把它分解成更小的块,可能会更容易理解:

createLevels() { 
    return forkJoin(this.levels.map(l => this.level(l));
}

copy() {
  this.create(skill).pipe(
    mergeMap(createdSkill => createLevels()).pipe(
      map(createdLevels => ([createdSkill, createdLevels]))  
    )
  )
  .subscribe(
    ([skill, levels]) => console.log({skill, levels})
  );
}

这样看来,我们似乎可以用更简单的方式构建 copy() 方法:

copy(skill) {
  forkJoin(
    this.createSkill(skill),
    this.createLevels()
  )
  .subscribe(
    ([skill, levels]) => console.log({skill, levels})
  );
}

【讨论】:

  • 非常感谢,你帮了我很多忙!
【解决方案2】:

ForkJoin 可能不是这里的最佳运算符。我建议看看operator decision tree。我相信你想要这样的东西吗?

 copy() {
    const obj = {};

    forkJoin(
       [
          this.create(skill),
          ...this.levels.map((level) => this.level(level))
       ]
    ).subscribe((res) => {
       console.log(res);
    });
  }

  level(level) {
    return this.create(level);
  }

【讨论】:

  • 我怎样才能得到第一种方法的结果并将其传递给第二种方法?
  • 在你做this.levels.map之前你需要this.create(skill)的结果吗?如果是这种情况,那么您根本不需要forkJoin。你可以使用mergeMap
  • 我还需要在subscribe中获取第一个请求和第二个的响应
  • 非常感谢,你帮了我很多!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-08
  • 1970-01-01
  • 1970-01-01
  • 2018-07-14
相关资源
最近更新 更多