2016-04-07 3 views
2

Ich lerne RxJs und es ist ziemlich cool. Ich versuche eine Seite zu erstellen, auf der der Ajax-Aufruf ein Intervall ist, so dass die Daten alle 5 Sekunden aktualisiert werden. Also dachte ich, ich würde das machen.Wie kombiniere ich Intervall-Stream mit Promise-Stream in RxJs und bekomme die Werte?

var ajax = new Promise(function(resolve) { 
    return resolve('test'); 
}); 

var source1 = Rx.Observable.interval(5000) 
    .map(function(i) { 
    return Rx.Observable.fromPromise(ajax); 
    }); 

source1.subscribe(function(res) { 
    res.subscribe(function(pro) { 
    console.log(pro); 
    }) 
}); 

jedoch die Tatsache, dass ich tun muss zwei subscribe s hat mir denken, dass ich vielleicht falsch hier etwas tun. Ich bin mir nicht sicher, ob ich in die richtige Richtung gehe?

Was ich will, ist ein Strom von Versprechen, die alle 5 Sekunden abgerufen werden.

Hier ist meine jsfiddle

https://jsfiddle.net/noppanit/2y179dgg/

Antwort

6

Sie müssen flatMap Operator verwenden. Werfen Sie einen Blick auf die jsbin here.

var ajax = new Promise(function(resolve) { 
    return resolve('test'); 
}); 

var source1 = Rx.Observable.interval(1000) 
    .flatMap(function(i) { 
    return Rx.Observable.fromPromise(ajax); 
    }); 

source1.subscribe(function(res) { 
    console.log(res); 
}); 

Es gibt umfangreiche Beispiele für die Verwendung von flatMap auf SO verfügbar.

Sie können auch konsultieren:

+0

, wenn Sie wollen Speichern Sie Ihre Bestellung von Versprechungen, die Sie 'concatMap' anstelle von' fl verwenden können atMap' Aber mehr besser für Versprechungen, 'flatMapLatest' zu verwenden – xgrommx

+0

Wenn Sie 'test' durch eine zufällige Zeichenfolge wie Math.random() ersetzen. toString (36) .substr (2, 5), können Sie sehen, dass die Ausgabevariable doesn ändere nicht. Gibt es eine Möglichkeit, Promise zu zwingen, in jedem Intervall ausgeführt zu werden? – khamaileon

+0

Versprechen werden nur einmal gelöst, also ja das ist das erwartete Verhalten. Wenn Sie in jedem Intervall ein anderes Versprechen haben wollen, dann machen Sie genau das. 'var source1 = Rx.Observable.interval (1000) .flatMap (Funktion (i) { Rückgabe makeYourPromiseHere (i); });' – user3743222

Verwandte Themen