我使用concatMap
运算符内部的复杂逻辑发送表单。一切正常,但是在我的订阅方法中,我还有其他的http请求,它触发2次而不是1次。我尝试使用takeLast
operator,但没有帮助。只有在中完成所有请求后,我才需要使用Subscribe方法发出请求concatMap
。例如,如果我有两个updateMember()
事件,则在每个请求之后,我都会从Subscribe方法中调用函数。
makeRequest(value) {
const team = toFormData(this.form.controls.profile.value);
this.teamService
.sendTeam(team)
.pipe(
concatMap(() => {
const tasks$ = [];
for (const [index, m] of this.form.controls.members.value.entries()) {
const member = toFormData(m);
if (m.id) {
tasks$.push(this.teamService.updateMember(member, m.id).pipe(take(1)));
} else if (!member.entries().next().done) {
if (member.has('name')) {
tasks$.push(this.teamService.createMember(member).pipe(take(1)));
} else {
(this.form.controls.members as FormArray).controls[index].markAllAsTouched();
this.scrollToFirstInvalidControl();
}
}
}
return tasks$.length ? concat(...tasks$) : EMPTY;
}),
)
.subscribe(() => {
this.teamService.getMembers().subscribe();
});
}
我应该使用什么来仅发出必要的请求?
我认为使用takeLast
是个好主意,但放置位置很重要:
this.teamService
.sendTeam(tem)
.pipe(
concatMap(() => {
/* ... */
return tasks.length ? concat(...tasks).pipe(last()) : EMPTY;
}),
// You can avoid to manually subscribe in the `subscribe`'s callback
switchMap(() => this.teamService.getMembers())
).subscribe()
concatMap
订阅通过调用提供的回调函数产生的可观察结果。
在这种情况下,该observable可以是concat(...tasks).pipe(last())
或EMPTY
。
如果是concat(...tasks).pipe(last())
,它将等待每个task
完成。last
在takeLast(1)
内部也使用。
顺便说一下,concat
可以这样看:
// concat(observables[])
from(observables[])
.pipe(
mergeMap(obs$ => obs$, 1)
)
如果是EMPTY
,它将立即发送完整的通知,这意味着将不会调用teamService.getMembers()
from switchMap(() => this.teamService.getMembers())
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句