2016-06-27 5 views
0

In Scala gibt es das Konzept Futures, wo ein Wert in einer Zukunft gespeichert wird, wenn es fertig ist. Und ich versuche etwas Ähnliches zu finden.Verwenden Sie eine Observable, um Daten über HTTP einmal abzurufen, speichern Sie dann den Wert für die Wiederverwendung.

Zum Beispiel möchte ich Zugriff auf "Benutzer" -Daten. Wenn ich zum ersten Mal darauf zugreife, möchte ich eine Anfrage an den Server senden, um die Daten zu erhalten, aber für alle nachfolgenden Zugriffe möchte ich den gespeicherten Wert verwenden können.

Der folgende Code versucht, etwas Ähnliches zu erreichen. Es garantiert nicht, dass der Anruf zum Server nur einmal erfolgt.

Apologies, ist die folgende in Typoskript:

class AuthenticationService { 

    http: Http = Some Http Helper... 

    user: Observable<User> = this.http.get("www.example.com/logged-in-user") 
    .map(data => { 
     let userObject = data.json().user 
     this.user = Observable.of(userObject) 
     return userObject 
    }) 
} 

Gibt es einen besseren Weg, dies zu tun?

+0

Lassen Sie mich sehen, ob ich corectly verstehen: Haben Sie alle möchten, dass abonniert immer "user", um das Ergebnis dieses HTTP GET zu erhalten, nicht nur der erste Aufrufer? – acdcjunior

Antwort

2

Wenn ich richtig verstanden habe, was Sie suchen, ist Rx.BehaviorSubject.

Es wird der letzte Wert speichern und für alle zukünftigen Abonnenten senden:

import Rx from 'rxjs/Rx'; // just for development, use a more specific when done 

class AuthenticationService { 

    http: Http = Some Http Helper... 

    user: Observable<User> = this.http.get("www.example.com/logged-in-user") 
    .map(data => { 
     let userObject = data.json().user 
     this.user = new Rx.BehaviorSubject(userObject) 
     return userObject 
    }) 
} 

Ein Beispiel für die Funktionalität allein:

/* Initialize with initial value of 42 */ 
var subject = new Rx.BehaviorSubject(42); 

function subsc(title) { 
    subject.subscribe(
    (x) => console.log(title + ' Next: ' + x.toString()), 
    (err) => console.log(title + ' Error: ' + err), 
    () => console.log(title + ' Completed') 
); 
} 

subsc("1st"); // Initial Next: 42 
subsc("2nd"); // Initial Next: 42 

subject.next(56); 

subsc("3rd"); // Initial Next: 56 

subject.complete(); 
+0

Danke, dass Sie mich auf den richtigen Weg gebracht haben. Ich lese alle Arten von Themen durch, und die, nach der ich suche, ist Async Subject. Vielen Dank! –