2017-01-13 4 views
3

Ich habe gerade angefangen, diese erstaunliche Sachen zu lernen. Ich kann nicht herausfinden, wie man Werte aus einer Reihe von Versprechen erhält. Hier ist, wo ich an:Holen Sie sich Werte aus einer Reihe von Versprechen

const one = new Promise(resolve => { 
    setTimeout(() => { 
    resolve(1); 
    }, 1000); 
}) 
const two = new Promise(resolve => { 
    setTimeout(() => { 
    resolve(2); 
    }, 2000); 
}) 
const observable = Rx.Observable.from([one, two]); 
observable.subscribe(v => console.log(v)); 

ich in der Konsole:

Promise { <pending> } 
Promise { <pending> } 

Ich mag würde bekommen:

  1. Ergebnis als Array von Werten [1,2]
  2. Ergebnis als Einzel Werte in der Reihenfolge der Versprechen Auflösung 1,2
So

, im Grunde möchte ich nacheifern:

  1. Promise.all([one, two])
  2. Promise.resolve(1), Promise.resolve(2)
+0

Dieser Beitrag Ihre Frage beantworten http://stackoverflow.com/questions/30519645/how-can-i -make-one-rxjs-beobachtbare-sequenz-warte-auf-ein-zu-fertig-vor – aliegm

Antwort

5

Statische Methode Observable.from() jedes Element im Array emittiert so, was Sie jetzt haben nur emittieren zwei Promise Objekte:

Sie haben es mit sogenannten Observablen höherer Ordnung (alias Observables, die Observable aussenden) zu tun. Dies ist in RxJS 5 leicht lösbar mit concatAll oder mergeAll je nachdem, ob Sie sich für die Reihenfolge, in der sie angegeben sind, interessieren oder sie als Lösung gesammelt werden können.

RxJS 5 behandelt Observables, Promises, Iteratoren, Array (und Array-ähnliche Objekte) auf die gleiche Weise. Das bedeutet, wir verwenden deine Versprechen genauso wie sie Observable waren.

Ich benutze mergeAll hier, um zu zeigen, dass die zweite Promise zuerst fertig war, obwohl sie in der umgekehrten Reihenfolge [one, two] definiert sind.

const one = new Promise(resolve => { 
    setTimeout(() => { 
    resolve(1); 
    }, 1000); 
}) 
const two = new Promise(resolve => { 
    setTimeout(() => { 
    resolve(2); 
    }, 500); 
}) 

// Result as individual values in order of promise resolution 2,1 
Rx.Observable.from([one, two]) 
    .mergeAll() 
    .subscribe(v => console.log('mergeAll: ' + v)); 

// Result as an array of values [2,1] 
Rx.Observable.from([one, two]) 
    .concatAll() 
    .toArray() 
    .subscribe(v => console.log(v)); 

Live-Demo Siehe: https://jsbin.com/tigidon/4/edit?js,console

Diese Drucke zu trösten:

mergeAll: 2 
mergeAll: 1 
[2, 1] 
+0

sir, du bist super! Ich liebe dich! Vielen Dank! –

Verwandte Themen