Как сделать синхронный вызов .Net Core 2.0 API из Angular 7 - PullRequest
0 голосов
/ 08 января 2019

Я студент и только начал изучать Angular 7 и .Net Core 2.0

Я создал несколько сессий в своих контроллерах в .Net Core API, и мне нужно вызвать их, чтобы реализовать некоторую защиту маршрутов в угловом режиме, и поэтому я сделал эту функцию на следующем рисунке, которая вызывает сеанс из API, чтобы проверить, разрешить ли маршрут или нет в Angular.

enter image description here

Вот так выглядит мой контроллер

enter image description here

Теперь, что происходит, когда я звоню, он попадает в контроллер, но поскольку он асинхронный, выполнение angular продолжается, а не сначала ожидает поступления данных из API, потому что на основе этих данных моя функция canActivate() в Angular собирается вернуть истину или ложь, к тому времени данные извлекаются и хранятся в переменной my line no. 38 в изображении уже было выполнено, и я установил его в false по умолчанию.

, пожалуйста, помогите, как вызвать данные синхронно, чтобы данные сначала выбирались из API, а затем достигали последней строки после Angular.

Ответы [ 2 ]

0 голосов
/ 08 января 2019

canActivate возвращает наблюдаемый | Обещание | булево;

Вы должны вернуть Observable<boolean> чем boolean и изменить метод на:

canActivate {
  return this.corpService.getSession().pipe(
    ...

    map(
     res => {
        if(res) {
         return true
        }
         // you can set redirect to permission page (use router.navigate)  

        return false;

     })
  )

}

Ajax является асинхронным. И canActivate разумно будет выполняться как асинхронный.


Если бы вы были в случае ошибки на back-end , верните 401.

 return Unauthorized(); // instead OK(null)

и обработать исключение на front-end

canActivate {
      return this.corpService.getSession().pipe(
        ...

        map(res => res),
        catchError((error: HttpErrorResponse) => {
            return Observable.throw(error.statusText);
        }));
      )

}
0 голосов
/ 08 января 2019

Не подписывайтесь на наблюдаемое и не сохраняйте результат в переменной-члене.

Просто верните отображенный результат как наблюдаемый, что-то вроде этого:

canActivate(...) {
    return this.corpService.geSession().pipe(
            map(data => {
                if (data == null)
                {
                    ...
                    return false;
                }
                else
                {
                    ...
                    return data[1] === 'true';
                }
            })
        )
}
...