Проверка NgxPermissions hasPermission внутри метода Observable в Angular 6 - PullRequest
0 голосов
/ 20 ноября 2018

Я использую ngx-permissions для обработки разрешений в моем приложении Angular 6.Я хотел бы проверить разрешения пользователя перед извлечением данных из конечной точки.Ngx-permissions предоставляет способ проверить разрешение пользователя в методе hasPermission (licenseName).Это возвращает обещание.Я хотел бы получить данные из конечной точки, используя Observable, поскольку я прочитал, что это угловой способ сделать что-то.Однако я не уверен, как объединить Обещание из проверки разрешения и метода Observable.

Служба:

getData(): Observable<Item[]<>>{
  this.permissionsService.hasPermission(Permission.CanViewData)
  .then(hasPermission => {
    if (hasPermission) {
      return this.http.get<Item[]>('http://endpoint/getdata', httpOptions).pipe(
        map(this.extractData), // this is calculated too late
        catchError(e => this.handleError(e, 'GetData', new Observable<Item[]>()))
      );
    }
  });
  return new Observable<Item[]>(); // this is always passed to the component
}

Компонент:

getData(): void {
  this.service.getData().subscribe(data => {
    this.data = data
  });
}

Я понимаю,Я не вызываю метод hasPermission правильно, так как мой код всегда падает до окончательного return new Observable<Item[]>();.Однако данные извлекаются из моей конечной точки - если я добавлю console.log, я вижу результат map(this.extractData).Просто рассчитывается слишком поздно.Компонент уже перешел и использует пустой Item[].

Как я могу использовать permissionsService.hasPermission из ngx-permissions, чтобы проверить разрешение пользователя, прежде чем пытаться получить данные и при этом вернутьНаблюдаемый моим компонентом?

1 Ответ

0 голосов
/ 20 ноября 2018

Да, и для записи это более общий вопрос rxjs.В любом случае вы должны преобразовать обещание в наблюдаемое, а затем выполнить цепочку вызова следующим образом:

import { of, from, Observable } from 'rxjs'; 
import { map, filter, flatMap } from 'rxjs/operators';

class Caller {

  public constructor(){}

  public call() : Observable<Item[]> {
    //the promise returned from your method it has to be typed with boolean
    var permission = new Promise<boolean>(function(resolve, reject) {
      setTimeout(function() {
        resolve(true);
      }, 300);
    });


    //calling from(prommisse) converts promes to observable.\
    return from(permission)
    .pipe(
      filter(t => t), //just a trick to avoid if statemt in the flatMap call
      flatMap( t => {
        //call your http get method here
        var it:Item = {property: "1"};
        return of<Item[]>([it])
      }))

  }
}

export class Item {
  property: String
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...