如何在 Angular 中等待 http 请求完成?

2024-02-15

我一直在构建一个 SPA,前端使用 Angular 4,后端使用 ASP.NET Core 2。基本上,我正在尝试在给定有效令牌的情况下自动续订用户登录名。例如,当我重新加载页面时,我希望 Angular 保持登录状态。我将令牌以及用户对象存储在本地存储上,以便我可以检查一些用户属性(如果他/她登录了)例子)。

我应该如何强制 Angular 等待 http 请求完成? 这是 .net get 服务:

get<T>(url: string): Observable<T> {
    let options = this.doHeaders();
    return this.doSub(this.http.get(this.doUrl(url), options));
}

private doSub<T>(obs: Observable<Response>) {
    var ob1: Observable<T> = obs.map(this.extractData)
        .catch(this.handleError);

    return ob1;
}

这是 HTTP 请求代码:

   getUser() {

    if (this.storage.token == null || this.storage.token == '') {
        return;
    }

    this.net.get<LoginModel>(`Authentication/GetUser`).subscribe(t => {
        this.storage.token = t.token;
        this.storage.user = t.user;
        console.log(this.storage.user);
    });
}

这是我检查用户的方式:

export class StorageService {

    constructor(
        private storage: LocalStorageService
    ) {
    }

    public user: User = null;

    public get isLoggedIn(): boolean {
        return this.user != null;
    }

}

export class IsLoggedIn implements CanActivate {

constructor(
    private storage: StorageService,
    private router: Router
) { }

canActivate(
    childRoute: ActivatedRouteSnapshot,
    state: RouterStateSnapshot
) {
    if (this.storage.isLoggedIn) {
        return true;
    }

    this.router.navigate(['account/login'], {
        queryParams: {
            return: state.url,
            message: 'You must be logged in'
        }
    });
    return false;
}}

真正的问题是:每当我尝试在受保护的页面上重新加载页面时,Angular 不会等待 http 完成,而是将我重定向到登录页面。大约几秒钟后,它登录了,但我已经被重定向了。 上面的代码是在AppComponent(NgOnInit)上执行的。提前致谢。


您可以将 Promise 与 async/await 一起使用

async getUser() {
    if (this.storage.token == null || this.storage.token == '') {
        return;
    }

    const t = await this.net.get<LoginModel>(`Authentication/GetUser`).toPromise();

    this.storage.token = t.token;
    this.storage.user = t.user;

    console.log(this.storage.user);
}

查看更多:

  • Promises https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise
  • async https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function
  • await https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await
  • ES8 异步/等待 https://medium.com/@_bengarrison/javascript-es8-introducing-async-await-functions-7a471ec7de8a
  • 异步/等待教程 https://hackernoon.com/6-reasons-why-javascripts-async-await-blows-promises-away-tutorial-c7ec10518dd9
  • 异步/等待解释 https://tutorialzine.com/2017/07/javascript-async-await-explained
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Angular 中等待 http 请求完成? 的相关文章

随机推荐

  • 无法从可执行共享库打印浮点数

    我正在开发一个共享库 它可以独立执行以打印它自己的版本号 我将自定义入口点定义为 const char my interp attribute section interp lib64 ld linux x86 64 so 2 void m
  • 将 Activiti 任务从旧流程迁移到新流程

    我有一个用于某些业务流程的 Activiti 项目 问题在于移民 现有流程有一些未完成的任务 我想通过添加新步骤来修改现有流程 现在 当我创建一个新任务时 这个新任务将根据更新的流程进行处理 而未完成的任务将按照旧流程进行处理 让我们看下面
  • IBM Watson Knowledge Studio - 注释负面/否定提及

    使用 Watson Knowledge Studio 注释提及内容时 通常会出现以下示例 我没有收到任何反馈 或 我从未收到任何反馈 如果我要注释上面提到的 反馈 那么它是一个 负面 例子 即它指的是没有发生的事情 创建自定义实体类型系统有
  • 如果对象成员没有值,如何为对象分配 null - automapper c#

    我在 C 中使用自动映射器 class A public int Value get set public string Code get set public B Details get set class B public int Id
  • 基于正则表达式的随机文本生成器[重复]

    这个问题在这里已经有答案了 我想知道是否有软件可以在给定正则表达式以及其他一些约束 例如长度 的情况下生成始终与给定正则表达式匹配的随机文本 谢谢 是的 可以生成与正则表达式随机匹配的软件 Exrex https github com as
  • sotimeout 在 android 2.1 上的多部分 http 帖子中不起作用

    我正在使用 android sdk 附带的 apache httpclient 使用多部分 http post 在服务器上上传文件 问题是 当我关闭设备上的 wifi 连接并且设置 sotimeout 和 connectiontimeout
  • 覆盖password_validation消息

    我使用 UserCreationForm 来创建新用户 from django contrib auth forms import UserCreationForm class RegistrationForm UserCreationFo
  • 在反应本机可触摸视图上启用触觉反馈

    我正在编写一个反应本机应用程序 我注意到虽然按钮在单击时看起来像本机按钮 但它们的行为并不像一个按钮 至少不像 Android 按钮的行为 单击 Android 应用程序按钮 发出声音并向用户提供触觉反馈 在声音中 我看到有 github
  • 为什么 TypeScript Iterable Iterator<> 和 Generator<> 泛型略有不同?

    在 TypeScript 中 3 6 3 发电机几乎与可迭代迭代器 When 发电机延伸迭代器 它默认第三个通用参数 TNext to unknown 迭代器本身默认TNext to 不明确的 So 发电机 and Iterator and
  • Angular CLI - 如何在可重用组件中引用图像路径

    需要帮助弄清楚如何将图像包含在另一个应用程序引用的可重用组件中 例如 我有一个 Angular 应用程序 我们称之为 UI Common 它包含通用组件 另一个 Angular 应用程序 我们称之为 Command Center 它将使用这
  • 我可以使用 ajax 和 jquery 访问我的私有 bitbucket 存储库吗?

    在我的网站上 我目前正在使用 jquery 从 bitbucket org 上托管的一个存储库生成标签列表 但为了做到这一点 我必须公开该存储库 我宁愿保密 我是否可以允许站点以这种方式访问 我的存储库 同时仍保持存储库的私有性 代码如下所
  • 使用 jQuery 实现滚动动画

    好吧 我在尝试使用滚动事件的条件对 DOM 的多个元素进行动画处理时遇到了问题 首先 我使用的是 Drupal 7 所以我使用的 jQuery 库的版本是 1 4 4 现在 我想通过更改页面内部元素的 css 属性来缩小页面向下滚动时标题的
  • 如何为新的 JPG 图像定义 DPi?

    我将使用 PHP 创建一个新的 JPG 图像 如何设置新 JPG 图像的 DBi 值 Dirk JPG 是一种像素格式 它并不真正了解每英寸点数等物理尺寸 你所能做的就是写一个dpi值到文件的元数据中作为进一步处理的帮助 但这只是一个建议
  • 由于服务器证书不匹配,jenkins 中的 SVN 命令行失败

    当我从 Jenkins shell 运行 svn 命令行时 出现以下错误 D Jenkins jobs Merge Trunk to Stable workspace stable gt svn up trust server cert n
  • 如何创建继承标准 .Net Core 脚本标签帮助器的脚本标签帮助器

    我维护着一个大型旧版 ASP NET MVC 应用程序 该应用程序最近已转换为 Net Core 我需要为 JavaScript 和 CSS 文件引入缓存清除 我很欣赏这可以轻松地使用asp append version true 新的 N
  • ASP.NET Webforms 中的部分 SSL 无需更改 IIS 配置

    我们有一个非常简单的 ASP NET Web 应用程序 主要包含静态内容和我们希望使用 SSL 保护的单一表单 安全页面位于其自己的文件夹中 但它继承自不安全的母版页 并且与网站的其余部分共享一些其他资源 徽标 CSS 文件和一些图片 该站
  • 来自 Google 地图的 NullPointerException

    我最近刚刚开始收到来自 Android 谷歌地图的空指针异常 但我不知道是什么原因导致的 目前 仅在运行 Android 4 1 的 HTC Desire 500 z4u 设备上报告了该问题 任何建议或想法将不胜感激 Edit 因此 我拿到
  • Google Schema 是否支持引用可打印编码?

    我试图自我测试 https developers google com gmail markup testing your schema self testing我的电子邮件模式 我的邮件发送时带有 Content Type text pl
  • 如何知道文件.apk使用密钥库进行签名?

    我有一个密钥库和一个 apk 有没有工具或方法来检查从此密钥库签名的文件 apk 我使用Eclipse 请有人帮助我 非常感谢 使用 jarsigner 工具 jarsigner verify verbose keystore keysto
  • 如何在 Angular 中等待 http 请求完成?

    我一直在构建一个 SPA 前端使用 Angular 4 后端使用 ASP NET Core 2 基本上 我正在尝试在给定有效令牌的情况下自动续订用户登录名 例如 当我重新加载页面时 我希望 Angular 保持登录状态 我将令牌以及用户对象