2017-10-12 2 views
0

Je souhaite chaîner plusieurs requêtes aux URL que je reçois du tableau. Avant la prochaine chaîne, je veux attendre que la précédente soit terminée. Ce n'est pas grave si le précédent échoue ou non. J'essayais cela avec forkJoin mais je sais que si l'une des requêtes échoue, elle retournera une erreur.Chaînage d'appels multiples avec foreach loop et Observable

this.dataServers.forEach(dataServer => { 
    observableBatch.push(this.getFoodsByQuery(dataServer.url, query)); 
}); 

return Observable.forkJoin(observableBatch).subscribe(data => { 
    this.searchingServer.next(null); 
    observer.complete(); 
}); 

Je ne sais pas comment faire cela avec flatMap.

+0

double possible de (https://stackoverflow.com/questions/43336549/ how-to-force-observables-to-execute-in-sequence) – martin

Répondre

1

Dans votre cas, l'opérateur est adapté concat

Concatène plusieurs observables ensemble en émettant séquentiellement leurs valeurs, une observables après l'autre.

Exemple:

// Batch of requests 
let batch = [ 
    Observable.of(1), 
    Observable.of(2).delay(1500), 
    Observable.throw('Error'), 
    Observable.of(3).delay(300), 
    Observable.throw('Error again'), 
    Observable.of(4).delay(600) 
]; 

// Catch (ignore) error of every request 
batch = batch.map(obs => { 
    return obs.catch(err => Observable.of(err)); 
}); 

// Concat observables 
Observable.concat(...batch).subscribe({ 
    next: v => console.log(v), 
    complete:() => console.log('Complete') 
}); 

sortie: [? Comment forcer à exécuter dans observables séquence]

1 
2 
'Error' 
3 
'Error again' 
4 
'Complete' 
+0

Ça a l'air génial J'ai modifié mon code de question et dans cette situation je dois m'abonner à v et mon problème est le fait que la résolution complète est résolue avant de m'abonner à la suivante. – Stefan

+0

J'ai un autre problème parce que je ne peux pas souscrire à l'élément v mais j'ai besoin que 'Observable.concat (... observableBatch) .subscribe ({ suivante: v => { v.subscribe (data => { this.searchingServer.next (this.dataServers [index]); index ++; observer.next (données); if (index == this.dataServers.length) { observer.complete(); ce produit. searchServer.next (null); } }) }, compléter:() => console.log ("complete") }); – Stefan

1

Avez-vous essayé d'utiliser OnErrorResumeNext() avec forkJoin?

return Observable.forkJoin(observableBatch) 
.OnErrorResumeNext() 
.subscribe(data => { 
    this.searchingServer.next(null); 
    observer.complete(); 
}); 
+0

Mais ces appels sont-ils faits un par un comme c'est le cas avec flatMap? – Stefan