2017-11-15 1 views
0

Ich habe einige Beiträge zu diesem Thema gelesen, aber ich habe immer noch nicht die Lösung dafür gefunden.Warten auf das Versprechen zu vervollständigen

Das ist mein Szenario:

Ich habe einen Dienst: PermissionService, das wie folgt aussieht:

constructor(private http: HttpClient){} 
hasPermission(operation: string, objects: string): Observable<Permission> { 
    let queryStr: HttpParams = new HttpParams(); 
    queryStr = queryStr.set(“operation”,operation); 
    queryStr = queryStr.set(“objects”,objects); 
    return this.http.get<Permission>(this.url + permissionType, { params: queryStr }); 
} 

In meiner Komponente ich den Dienst injiziert haben und ich benutze es wie folgt aus:

hasCreatePermission(){ 
     this.permissionsService.hasPermission("C","Categories").subscribe(
      res => { 
       this.canCreate = res.data[0].result; 
      }, (err: HttpErrorResponse) => { 
      if (err.error instanceof Error) { 
       console.log('An error occurred:', err.error.message); 
      } else { 
      console.log(`Backend returned code ${err.status}, body was: ${err.error}`); 
     } 
    }); 
} 

Wenn das Versprechen abgeschlossen ist, wird die Variable canCreate mit dem Wert der Berechtigung festgelegt.

Diese Variable wird in meiner Vorlage verwendet, um bestimmte Komponenten wie Schaltflächen auszublenden oder anzuzeigen.

All dieses Zeug funktioniert ordnungsgemäß. Also meine Frage ist .. gibt es einen Weg in Angular, um es synchron zu machen?

Um das Verfahren zu nennen wie:

This.canCreate = this.servicePermission.hasPermission .... Ich setze die Ausführung nicht fort, bis das Versprechen gelöst ist, damit ich das Ergebnis erhalten kann, bevor die Vorlage gerendert wird.

Ich brauche das, weil ich eine Seite mit Schaltflächen nicht anzeigen kann, die nach einigen Sekunden aufgrund der Berechtigungen verschwinden werden.

Ich stimme zu, dass einige Aufrufe an das Backend wie das Abrufen von Daten vom Server async sein müssen, aber in diesem Fall muss das Ergebnis in der Lage sein, die Seite entsprechend zu rendern.

Antwort

1

Sie müssen nicht auf die Auflösung warten, um Ihre Komponente zu rendern, die davon abhängt, was der aufgelöste Wert ist.

Was sollten Sie tun, ist die async pipe in Ihrer Komponente Markup verwenden, und bedingt Tasten machen usw.

So etwas wie

<button [hidden]="!canCreate | async">Click me if allowed!</button>

0

Http-Anfragen zurückgeben Obseravbles, um den Browser nicht zu blockieren . Wenn Sie das Laden Ihrer Komponente/Vorlage verzögern möchten, sollten Sie Resolver in Angular verwenden. Sie sind speziell für dieses Szenario gemacht.

Mehr auf Resolvern und Prefetching https://angular.io/guide/router#resolve-pre-fetching-component-data

Verwandte Themen