【问题标题】:How to block execution of code in Angular?如何阻止Angular中的代码执行?
【发布时间】:2018-05-03 16:50:28
【问题描述】:

我很麻烦。我正在尝试在 JavaScript 中阻止我的代码(是的,我知道这是不可能的)。

我正在使用 async/await 执行一些工作,然后我想返回一个值。

这是代码

import {Injectable, Injector} from '@angular/core';
import {HttpEvent, HttpInterceptor, HttpHandler, HttpRequest} from '@angular/common/http';
import {Observable} from 'rxjs/Observable';
import {AuthService} from '../services/auth.service';

export const InterceptorSkipHeader = 'X-Skip-Interceptor';

@Injectable()
export class AuthInterceptor implements HttpInterceptor {

  constructor(private injector: Injector) {

  }

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
   /* const auth = this.injector.get(AuthService);

    if (req.headers.has(InterceptorSkipHeader)) {
      const headers = req.headers.delete(InterceptorSkipHeader);
      return next.handle(req.clone({headers}));
    }

    auth.getToken(s => {
      req = req.clone({
        setHeaders: {
          'Content-Type': 'application/json; charset=utf-8',
          'Authorization': 'Bearer ' + s
        }
      });
    }); ¨*/



    this.fetchUser()
      .then((user) => {
        console.log(user);
      });

    console.log("gets printed first");

    return next.handle(req);
  }

  async fetchUser() {
    try {
      const auth = await this.checkAuth(); // <- async operation
      const user = await this.getUser(auth); // <- async operation
      return user;
    } catch (error) {
      return {name: 'Default'};
    }
  }

  checkAuth() { return "hello"; }
  getUser(auth) { return "Kevin"; }
}

“这首先打印”在“Kevin”打印之前打印。 Ergo:函数在 async/await 函数完成之前返回。

有什么解决办法吗?提前致谢。

问候, 凯文

【问题讨论】:

  • 阻塞是什么意思,要中止一些正在运行的代码的执行吗?
  • 我的意思是我希望执行等待异步操作。我希望 this.fetchUser() 在其余部分(console.log 和下一个返回)被执行之前完成。

标签: angular asynchronous async-await rxjs observable


【解决方案1】:

在记录用户名之前打印“首先打印”字符串,因为在下一个事件循环上触发了承诺解析回调。 从MDN documentation on promises我们可以看出:

  • 在 JavaScript 事件循环的当前运行完成之前永远不会调用回调。
  • 使用 .then 添加的回调即使在异步操作成功或失败后也会被调用,如上。

我猜你真正想要的是使用Angular guards 来检查用户是否经过身份验证,而不是在拦截器中这样做。

【讨论】:

  • 所以...我无法实现我想做的事情?
  • 答案取决于你真正想要做什么。如果您想自动刷新身份验证令牌,那么您可以通过拦截器来处理它,只需在发出实际请求之前调用 auth 服务即可。请注意,如果每页有很多 http 请求,这会影响应用程序的性能。如果只是想检查用户是否通过身份验证,那么最好使用路由保护。
猜你喜欢
  • 1970-01-01
  • 2016-11-05
  • 2015-11-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-23
  • 2018-10-24
  • 2021-12-22
  • 1970-01-01
相关资源
最近更新 更多