2017-10-17 3 views
0

Je chargement des données à partir de différents critères d'évaluation de l'API, puis faire un travail synchrone sur chaque ensemble de données:RxJs: Comment invoquer la méthode lorsque le travail des souscriptions de deux observables est fait

// Invoked by user interaction 
loadData() { 
    this.service1.getData().subscribe(
     data => { 
     this.doSynchronousWork(data); 
     this.data1 = data; 
     } 
    ); 

    this.service2.getData().subscribe(
     data => { 
     this.doSynchronousWork(data); 
     this.data2 = data; 
     } 
    ); 
} 

// To be invoked when this.data1 and this.data2 is available 
doSynchronousWorkWhenAllDataIsLoadedAndProcessed() 

Maintenant, je dois appeler une autre méthode synchrone lorsque les deux abonnements ont fait leur travail. Comment puis je faire ça?

Répondre

3

Pour ce faire, vous utilisez forkJoin, où vous ajoutez tous vos un tableau comme observables et ils courent asynchronuously renvoyer les données dans un tableau comme si

import { Observable} from 'rxjs/Observable'; 
import 'rxjs/add/observable/forkJoin'; 

console.log("Owk ooo let's play small with observables "); 

// this is just to form an asynchronous process 
asyncSimulator(data: number): Observable <any> { 
    return Observable.create(observer => { 
    setTimeout(() => { 
     observer.next("data to send can be object or anything" + data); 
     console.log("am done"); 
     observer.complete(); //to show we are done with our processing 
    }, 2000); 
    }) 
} 

/** 
call the all asynchronous process here, like so with Fork Join 
*/ 
Observable.forkJoin([ 
    this.asyncSimulator(1), 
    this.asyncSimulator(2), 
    this.asyncSimulator(3), 
    ]) 
    .subscribe(results => { 
    let async1 = result[0]; 
    let async2 = result[1]; 
    let async3 = result[1]; 
    console.log("results is an array", results); 
    }); 

Hope this helps.

+0

Hmm, désolé, je ne comprends pas. Comment puis-je obtenir un autre Observable après la fin de mon abonnement()? Je pourrais ajouter un gestionnaire complet(). Mais je ne sais pas quoi faire dedans ... – Knack

+1

oh, je suis juste en train d'émuler une tâche asynchrone avec la méthode 'asyncSimulator', la chose principale est la' forkJoin' voir comment elle a été appelée, vous passez votre différent processus asynchrone un tableau puis le résultat de l'abonnement est un tableau des résultats dans l'ordre où vous passez vos processus asynchrones @Knack –