2017-10-19 27 views
3

J'ai un service this.service.getAllItems() retour observable d'un ensemble d'éléments: Observable<ITEM[]>Observable de tableau à tableau (Rxjs)

je mapper le résultat comme celui-ci pour poster chaque article à un RestAPI:

this.service.getAllItems() 
.map(items => ...for each item of items, call this.apiService.postMessage(item)...) 

postMessage(item) renvoie un Observable<Response>

=> et mon but est d'obtenir un Observable<Response[]> pour lequel je peux vérifier le code http de chaque poste de this.apiService.postMessage(item)

J'ai essayé d'utiliser flatMap:

this.service.getAllMessages() 
    .flatMap(items => { 
    return items.map(item => { 
     return this.apiService.postMessage(item); 
    }); 
    }).subscribe(RES => { 
    console.log(RES); 
    }); 

mais ici RES est un Observable<Response> et non d'un simple Response

Comment puis-je y parvenir?

Merci

Répondre

1

Ce qui est retourné par votre this.service.getAllMessages() est un tableau de Observable, pas Observable de tableau. La fonction .map() appartient à la fonction de tableau.

Si vous voulez exécuter tous les Observables en parallèle, utilisez .forkJoin():

this.service.getAllMessages() 
    .flatMap(items => { 
     return Observable.forkJoin(items.map(item => this.apiService.postMessage(item))); 
    }) 
    .subscribe(RES => { 
     console.log(RES); 
    }); 

Si vous voulez exécuter les observables en séquentiel, utilisez .concat():

this.service.getAllMessages() 
    .flatMap(items => { 
     return Observable.concat(...items.map(item => this.apiService.postMessage(item))); 
    }) 
    .subscribe(RES => { 
     console.log(RES); 
    }); 

Notez l'opérateur propagation pour .concat.

+0

Merci beaucoup d'avoir sauvé ma journée! (ne savait pas à propos de l'opérateur de propagation, heureux d'apprendre) – thk