英文:
Subscription after switchMap does not work
问题
我已经创建了一个确认对话框,根据用户的选择返回true或false。
这是打开对话框并处理响应的函数:
public action(id: number): void {
this.dialogService.openDialog(ConfirmationComponent).afterClosed()
.pipe(
switchMap(
(result: boolean) => {
if (result) {
return this.service.doSomething(id);
} else {
return of('cancelled');
}
}
)
).subscribe({
next: (response: string) => {
this.snackBarService.openSnackBar(response, 'valid');
},
error: (error: HttpErrorResponse) => {
this.httpService.handleError(error);
},
complete: () => {
this.getData();
}
}
);
}
当对话框返回false时,Snackbar会弹出消息“cancelled”(如预期),并执行getData()函数。然而,当对话框返回true时,会执行doSomething(id)函数(如预期),但Snackbar不会弹出,也不会执行getData()。
有没有人知道为什么它会这样行为?我无法弄清楚。
英文:
I have created a Confirmation dialog that returns true or false, based on the user's choice.
This is the function that opens the dialog and handles the responses:
public action(id: number): void {
this.dialogService.openDialog(ConfirmationComponent).afterClosed()
.pipe(
switchMap(
(result: boolean) => {
if (result) {
return this.service.doSomething(id);
} else {
return of('cancelled');
}
}
)
).subscribe({
next: (response: string) => {
this.snackBarService.openSnackBar(response, 'valid');
},
error: (error: HttpErrorResponse) => {
this.httpService.handleError(error);
},
complete: () => {
this.getData();
}
}
);
}
When the dialog returns false, the snack-bar opens with the message cancelled (as expected) and the getData() function gets executed. However, when the dialog returns true, the doSomething(id) function gets executed (as expected), but the snack-bar does not show up, and getData() is not executed.
Does anybody have any idea why it's behaving like that? I can't figure it out.
答案1
得分: 1
这实际取决于this.service.doSomething(id)返回的内容。我猜它是一个Observable,但根据你的描述,它从未发出过next,也没有发出complete。它可能返回一个空的Observable,比如EMPTY或者只是new Observable()。
所以这里的解决方案是确保this.service.doSomething(id);发出并完成。
英文:
This really depends on what this.service.doSomething(id) returns. I suppose it's an Observable but based on your description it never emits any next and no complete. It might return an empty Observable such as EMPTY or just new Observable().
So the solution here is to make sure that this.service.doSomething(id); emits and completes.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论