2016-10-27 4 views
1

Ich habe eine beobachtbare, der auf ein Array ausgibtAbonnieren innerhalb eines mehrfach Abonnieren wiederholende

subscribe
appleProducts.subscribe((snap) => { 
    console.log(snap); 
}); 

iphone.subscribe((snap) => { 
    console.log(snap); 
}); 

Konsolausgabe:

[ipad, iphone, Mac]

[ iphone4, iphone5, iphone6]


Die beiden Abonnenten werden asynchron ausgeführt. Ich brauche aber appleProducts vor iphone zu bekommen, also wenn ich setze iphone.subscribe Funktion innerhalb appleProducts.subscribe Funktion, etwas sonderbaren passiert:

appleProducts.subscribe((snap) => { 
    console.log(snap); 
    iphone.subscribe((snap) => { 
     console.log(snap); 
    }); 
}); 

Konsolenausgabe:

[ipad, iphone, mac]

[iphone4]

[iphone4, iphone5]

[iphone4, iphone5, iphone6]


Versteht jemand, warum dies geschieht? Dank

+0

Gibt es eine Abhängigkeit zwischen den beiden Observablen? Bedeutung brauchen Sie Ausgang von der ersten, um die zweite auszulösen? Sieht nicht so aus wie der Code, den Sie zeigen, sondern nur bestätigen, da die Antwort geändert wird. Wenn es nur um Ordnung geht, hat @BeetleJuice die richtige Antwort. – TGH

Antwort

1

Um die Ergebnisse von einer beobachtbaren alle, bevor die Ergebnisse aus dem nächsten, die instance operator concat

appleProducts.concat(iphone).subscribe(...) 

Das Abonnement wird zunächst gibt die Ergebnisse des ersten beobachtbaren verwenden. Sobald dies abgeschlossen ist, werden die Ergebnisse des zweiten ausgegeben.

Sie könnten das gleiche Ergebnis unter Verwendung des static method concat

Observable.concat(appleProducts, iPhone).subscribe(...) 
+0

das hat nicht für mich funktioniert ... es ist immer noch zu wiederholen –

+0

@ArielGelbard können Sie überprüfen: Wenn Sie einfach 'iphoneScribe (...)', erhalten Sie ein einzelnes Array gedruckt? – BeetleJuice

+0

yup, ich habe dreifach überprüft, es funktioniert nicht ... es abonniert die fire base beobachtbare ex. "This.angularfire.database.list (appleProductsObjectURL) .subscribe (" –

0

So, nachdem führen zum ‚concat‘ Funktion von rxjs ist, schaute ich in andere Dinge wie ‚forkJoin‘ (was nicht funktioniert) gefunden, und ich meine Lösung mit 'merge'

Lösung von Beispielcode:

var source = Rx.Observable.merge(
    appleProducts, 
    iphone); 

var subscription = source.subscribe(
    function (x) { 
     console.log('Next: ' + x); 
    }, 
    function (err) { 
     console.log('Error: ' + err); 
    }, 
    function() { 
     console.log('Completed'); 
    }); 

Konsole Ausgang:

[ipad, iphone, mac]

[iphone4, iphone5, iphone6]

+0

Vorsicht: 'merge' garantiert nicht, dass Ergebnisse aus einer Quelle vor den Ergebnissen der anderen ankommen; gibt nur die Daten aus, wenn sie eintreffen Wenn also die Reihenfolge für Sie wichtig ist (es war Ihr erklärtes Ziel), können Sie sich später für Kopfschmerzen sorgen – BeetleJuice

+0

ja Sie haben Recht, die Reihenfolge ist wichtig für mich, wh schlagen Sie stattdessen vor? –