提问人:Rui 提问时间:9/21/2023 更新时间:9/21/2023 访问量:44
如何在 Angular 的 CanDeactivateFn 保护中发出异步请求?
How do you make an async request inside a CanDeactivateFn guard in Angular?
问:
也许是一个奇怪的问题,但我一直在解决这个问题。
我有这个函数,它实际上只是一个自定义警报窗口,如果用户尝试留下包含未保存数据的表单,它可能会或可能不会被调用。
export const unsavedDataGuard: CanDeactivateFn<boolean> = async () => {
const utService: UTService = inject(utService);
const alertService: AlertService = inject(AlertService);
const unsaved = utService.unsaved;
if (unsaved) {
await alertService
.openQuestion('Cancel?')
.afterClosed()
.subscribe(result => {
if (result) {
return true;
} else {
return false;
}
});
} else {
return true;
}
};
目前,它给了我这个错误
Type '() => Promise<true | undefined>' is not assignable to type 'CanDeactivateFn<boolean>'.
而这个警告
Not all code paths return a value.
我了解错误是什么,甚至了解它在哪里被调用。如果我只是在 await 函数之后返回 true 或 false,它不会再给我任何错误,但它会有效地使函数变得无用。警报仍会显示,但它将毫无意义,因为它的按钮不会执行任何操作。
我也不明白为什么如果我简单地使用 javascript 中的通用确认窗口,这不会引发错误。
confirm("Press a button!");
考虑到它将以同样的方式工作。
答:
1赞
Matthieu Riegler
9/21/2023
#1
CanDeactivateFn
,接受或 Promise 作为返回类型,因此不要订阅并返回可观察对象或承诺。Observable<boolean>
某物链接:return alertService.openQuestion('Cancel?').afterClosed()
评论