2017-10-12 3 views
0

Ich möchte mehrere Anfragen an die URLs, die ich aus dem Array bekomme ketten. Vor der nächsten Kette möchte ich auf den vorherigen warten. Es spielt keine Rolle, ob das vorherige fehlschlägt oder nicht. Ich habe dies mit forkJoin versucht, aber ich weiß, dass, wenn eine der Anfragen fehlschlägt, es einen Fehler zurückgibt.Verketten Sie mehrere Anrufe mit foreach-Schleife und Observable

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

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

Ich weiß nicht, wie das mit FlatMap zu tun.

+0

Mögliches Duplikat (https://stackoverflow.com/questions/43336549/ how-to-force-observables-in-sequence ausführen) – martin

Antwort

1

In Ihrem Fall geeigneten Operator ist concat

Verkettet mehrere Observable durch sequenzielles zusammen ihre Werte aussendet, eine Observable nach dem anderen.

Beispiel:

// 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') 
}); 

Ausgang: [? Wie Observablen zu zwingen, in der Reihenfolge auszuführen]

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

Es sieht gut aus Ich habe meinen Fragecode bearbeitet und in dieser Situation muss ich mich bei v anmelden, und mein Problem ist Tatsache, dass abgeschlossen ist, bevor ich mich bei allen nächsten abmelde. – Stefan

+0

Ich habe ein anderes Problem, weil ich nicht zu v Elemente abonnieren können, aber ich brauche, dass 'Observable.concat (... observableBatch) .subscribe ({ nächste: v => { v.subscribe (data => { this.searchingServer.next (this.dataServers [index]); index ++; observer.next (Daten); if (index == this.dataServers.length) { observer.complete(); dies. searchingServer.next (null); } }) }, complete:() => console.log ("complete") }); ' – Stefan

1

Haben Sie versucht, OnErrorResumeNext() mit forkJoin zu verwenden?

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

Aber diese Aufrufe werden nacheinander ausgeführt, wie es mit FlatMap ist? – Stefan