为什么在尝试执行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"

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

传递给mergeMap()的函数应该">通常"返回一个可观察对象。当前,您正在返回一个数组。

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

我认为这个可以为你工作:

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

ForkJoin可能不是这里的最佳操作符。我建议看一下操作员决策树。我相信你想要这样的东西?

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

最新更新