如何在 Angular 的 CanDeactivateFn 保护中发出异步请求?

How do you make an async request inside a CanDeactivateFn guard in Angular?

提问人:Rui 提问时间:9/21/2023 更新时间:9/21/2023 访问量:44

问:

也许是一个奇怪的问题,但我一直在解决这个问题。

我有这个函数,它实际上只是一个自定义警报窗口,如果用户尝试留下包含未保存数据的表单,它可能会或可能不会被调用。

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!");

考虑到它将以同样的方式工作。

Angular TypeScript 异步 rxjs 订阅

评论


答:

1赞 Matthieu Riegler 9/21/2023 #1

CanDeactivateFn,接受或 Promise 作为返回类型,因此不要订阅并返回可观察对象或承诺。Observable<boolean>

某物链接:return alertService.openQuestion('Cancel?').afterClosed()