当前位置: 首页 > 知识库问答 >
问题:

如何在Angular 6中处理来自后端的多个异步请求?

印辉
2023-03-14

我对Angular很陌生,很难掌握如何处理异步请求。

我有3个组件:父组件-AppComponent子组件-LoginComponent、NavbarComponent、仪表板组件、MainComponent、SidebarComponent

和一个AuthService

在日志组件上按“Login”按钮时,我需要将布尔值“true”传递给所有组件。在按下导航栏组件上的“注销”按钮时,我需要将布尔值“false”传递给所有组件,并设置user=null

如果是真的-

>

  • 在本地存储中设置带有用户ID的令牌

    预成型http。得到(”http://localhost:3000/user/“id)请求检索完整的用户信息,并将用户信息注入仪表板、主、侧栏、应用程序和导航栏组件。

    问题是,每当我注销所有组件上的假/真值更新时,用户信息不会变成空,除非我刷新页面或将其与路由器一起发送到另一个组件,然后返回到Main Component,与新登录相同。

    如何在不刷新页面的情况下立即更新所有组件中的用户信息和状态?

    授权服务:

    import { Injectable } from "@angular/core";
    import { HttpClient } from "@angular/common/http";
    import { Router } from "@angular/router";
    
    import { User } from "../models/User";
    
    @Injectable({ providedIn: "root" })
    export class AuthService {
      user: User;
      private _url = "http://localhost:5000/user/";
    
      constructor(private http: HttpClient, private _router: Router) {}
    
      registerUser(user) {
        return this.http.post<any>(this._url + "register", user);
      }
    
      loginUser(user) {
        return this.http.post<any>(this._url + "login", user);
      }
    
      logoutUser() {
        localStorage.clear();
        this._router.navigate(["/"]);
      }
    
      loggedIn() {
        return !!localStorage.getItem("token");
      }
    
      getToken() {
        return localStorage.getItem("token");
      }
    
      getCurrentUser() {
        return this.http.get<any>("http://localhost:5000/shop/current");
      }
    }
    

    主/侧栏组件:

    import { Component, OnInit, DoCheck } from "@angular/core";
    
    import { AuthService } from "src/app/services/auth.service";
    
    import { User } from "src/app/models/User";
    
    @Component({
      selector: "app-sidebar",
      templateUrl: "./sidebar.component.html",
      styleUrls: ["./sidebar.component.css"]
    })
    export class SidebarComponent implements OnInit, DoCheck {
      isSidenavOpen: boolean = true;
      user: User;
    
      constructor(private _authService: AuthService) {}
    
      ngOnInit() {
        if (this._authService.loggedIn()) this._authService.getCurrentUser().subscribe(res => (this.user = res.user));
        else this.user = null;
      }
    
      ngDoCheck() {
        if (!this._authService.loggedIn()) this.user = null;
      }
    }
    

    登录:

      constructor(private _authService: AuthService, private _router: Router) {}
    
    
    
      // onLoginUser() {
      //   this._authService.loginUser(this.loginUserData).subscribe(
      //     res => {
      //       localStorage.setItem("token", res.token);
      //       localStorage.setItem("user", res.user._id);
      //       this._router.navigate(["/"]);
      //     },
      //     err => console.log(err)
      //   );
      // }
    }
    
  • 共有1个答案

    裴威
    2023-03-14

    使用事件EventEmitter在登录、注销等时发出事件并监听每个组件,这取决于用户数据

    在服务中,您可以调用logoutUser,logiuserAuthService的方法:

    // LoginService
    userLoggin: EventEmitter<User> = new EventEmitter();
    userLoggout: EventEmitter<any> = new EventEmitter();
    
    constructor(private _authService: AuthService, private _router: 
    Router) {}
    
    loginUser() {
      this._authService.loginUser(this.loginUserData).subscribe(
        res => {
          localStorage.setItem("token", res.token);
          localStorage.setItem("user", res.user._id);
          this.userLoggin.emit(res.user);
          this._router.navigate(["/"]);
        },
        err => console.log(err)
        );
      }
    
      logoutUser() {
      this._authService.logoutUser().subscribe(
        res => {
          this.userLoggout.emit();
        },
        err => console.log(err)
        );
      }
    }
    

    然后在组件中:

    import { Component, OnInit, DoCheck } from "@angular/core";
    
    import { AuthService } from "src/app/services/auth.service";
    
    import { User } from "src/app/models/User";
    
    import { LoginService } from "src/app/services/login.service";
    
    @Component({
      selector: "app-sidebar",
      templateUrl: "./sidebar.component.html",
      styleUrls: ["./sidebar.component.css"]
    })
    export class SidebarComponent implements OnInit, DoCheck {
    isSidenavOpen: boolean = true;
    user: User;
    loggin$: Subscription;
    logout$: Subscription;
    
      constructor(private _authService: AuthService, private _loginService: LoginService) {
        this.loggin$ = this._loginService.userLoggin.subscribe(user => {
          this.user = user;
        });
    
        this.logout$ = this._loginService.userLoggout.subscribe(user => {
          this.user = null;
        });
      }
    
      ngOnInit() {
      }
    
      ngOnDestroy() {
        this.loggin$.unsubscribe();
        this.logout$.unsubscribe();
      }
    }
    
     类似资料:
    • 问题内容: 单个Servlet如何处理以用户请求形式出现的多个客户端请求?基于单例设计模式,我知道我们创建了一个servlet实例,但是单个servlet如何处理数百万个请求。对其所涉及的线程也感到困惑。 同样,这里提供了任何浏览器规范或设置,可用于跨请求发送请求或生成针对请求发送的线程。 所有框架都相同还是不同(例如,struts v / s springs)? 问题答案: Struts / S

    • 请给我一些关于任务解决方案的最佳模式的建议。我的任务是: 用户通过自己的rest控制器向Camunda处理器发出请求 后端端的BPMN架构由多个异步服务链组成 只有当BPMN上的一个最终服务做出响应时,数据才准备好响应给用户。 每条链条的工作时间不超过10-15秒。并且用户的会话计数每小时少于500个。 rest管制员的工作如何组织?在同一调用中强制控制器等待结果是否可以接受?瓶颈在哪?

    • Spring MVC 3.2开始引入了基于Servlet 3的异步请求处理。相比以前,控制器方法已经不一定需要返回一个值,而是可以返回一个java.util.concurrent.Callable的对象,并通过Spring MVC所管理的线程来产生返回值。与此同时,Servlet容器的主线程则可以退出并释放其资源了,同时也允许容器去处理其他的请求。通过一个TaskExecutor,Spring M

    • 本文向大家介绍angularjs 处理多个异步请求方法汇总,包括了angularjs 处理多个异步请求方法汇总的使用技巧和注意事项,需要的朋友参考一下 在实际业务中经常需要等待几个请求完成后再进行下一步操作。但angularjs中$http不支持同步的请求。 解决方法一: 解决方法二: then中的方法会按顺序执行。 解决方法三: $q.all方法第一个参数可以是数组(对象)。在第一参数中内容都执

    • React中组件A里有个获取配置数据的异步请求,列表中多个组件A就会触发多个相同的异步请求,期望是等到第一个异步请求回来进行数据缓存,剩下组件直接读取缓存来获取配置数据。 我想了一下,使用axios的拦截器把请求拦截下来处理,但是如何让剩下的组件进行等待呢?或者有什么其他思路?

    • 问题内容: 假设我有某种游戏。我有一个buyItem函数,如下所示: 如果我对该路由进行垃圾邮件处理,直到扣除用户余额(第二次查询),则用户余额仍为正。 我尝试过的 问题是将在第一〜5项要求。因此,这也不起作用。 我们如何处理这种情况?如果重要的话,我正在使用Sails.JS框架。 问题答案: 通过该方法,Sails 1.0现在具有完整的事务支持。例: 更新资料 正如一些评论者所指出的,启用连接池