为什么在尝试执行请求 Observable 时会返回它?

Why is it returned when trying to execute the request Observable?

我是 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: ƒ}

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

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);
  }

我不完全确定我明白你想做什么:-)

您传递给 mergeMap() 的函数应该“通常”return 是一个可观察的。目前,您正在 return 创建一个数组。

  • 当您 return array 时,mergeMap 将简单地发射每个数组元素;这就是为什么您会收到这两个发射 created skillObservable.
  • 但是,如果您 return 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})
  );
}