0

Je travaille sur une application Angular4.Comment utiliser les données d'un observable dans d'autres méthodes?

Voici un service que je utilise pour obtenir le Data-

export class BookingService { 

    constructor(private http: HttpClient) {} 

    getMemberBookings(memberID: number): Observable<any> { 
    return this.http.get('http://myapi.com/bookings/member/'+memberID).map(response => response['bookings']); 
    } 
} 

Et puis dans mon component

export class PrintButtonComponent implements OnInit { 

    bookings: any; 

    constructor(private service: BookingService) {} 

    ngOnInit() {} 

    downloadPDF() {  
      this.getBookings(memberID); 

      //pdf creation logic 
    } 

    getBookings(memberID: number) { 
      this.service.getMemberBookings(memberID).subscribe(data => this.bookings = data);  
    } 

} 

Le problème est que je veux utiliser les données du service dans la méthode downloadPDF car il y a d'autres données qui seront nécessaires pour créer le PDF. Mais quand je renvoie les données de l'abonnement ou le mettre à une propriété, il donne indéfini. Je comprends que cela est dû à la nature asynchrone, mais je ne veux pas mettre ma logique de création pdf dans la méthode subscribe. Alors comment résoudre ce problème? Je suis assez nouveau à Angular et observables. Merci.

Répondre

0

Puisque le code ci-dessus implique pas plusieurs valeurs par observables et ne nécessite pas de coller à eux, cela peut être fait avec async..await sans imbrication supplémentaire:

async downloadPDF() {  
     await this.getBookings(memberID); 

     //pdf creation logic 
} 

async getBookings(memberID: number) { 
     this.bookings = await this.service.getMemberBookings(memberID).toPromise(); 
} 

Comme tout autre opérateur RxJS, toPromise doit être importé.

+0

Merci, cela fonctionne. Mais qu'entendez-vous par «valeurs multiples par observable»? Et n'y a-t-il aucun moyen de le faire avec la méthode observable-abonné? – doctorsherlock

+0

Une promesse peut avoir une valeur avec laquelle elle se résout. Un observable peut avoir plusieurs valeurs émises. HttpClient n'a qu'une seule valeur avec laquelle il peut être remplacé en toute sécurité par une promesse. Vous pouvez le faire avec observable, mais vous devez déplacer la «logique de création pdf» dans 'subscribe'. – estus