Как заблокировать выполнение кода в Angular? - PullRequest
0 голосов
/ 03 мая 2018

Я в большой суматохе. Я пытаюсь заблокировать свой код в 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"; }
}

«Сначала печатается» печатается до того, как печатается «Кевин». Ergo: функция возвращается до завершения функции async / await.

Какие-нибудь решения? Заранее спасибо.

С уважением, Kevin

1 Ответ

0 голосов
/ 03 мая 2018

строка «сначала печатается первым» печатается перед регистрацией имени пользователя, потому что обратный вызов разрешения обещания запускается в следующем цикле событий. Из документации MDN по обещаниям видно, что:

  • Обратные вызовы никогда не будут вызываться до завершения текущего запуска цикла событий JavaScript.
  • Обратные вызовы, добавленные с .then даже после успешного или неудачного выполнения асинхронной операции, будут вызываться, как указано выше.

Полагаю, вам действительно нужно использовать Угловые защитники для проверки подлинности пользователя или нет, вместо того, чтобы делать это в перехватчике.

...