2017-02-01 3 views
0

Also ich benutze Angular 2 und kämpfen, um eine HTTP-Anfrage beobachtbar machen, um über mehrere Beobachter geteilt werden. Genauer möchte ich alle Antworttypen, einschließlich Fehler, teilen.Rxjs - kann nicht kalt beobachtbar in einen heißen konvertieren

habe ich so versucht:

return this._http.request(new Request(options)) 
    .map((res: Response) => this.refreshToken(res)) 
    .share() 

und dann

this.data.request() 
    .map((response: Response) => (new financeiro.FetchCompletedAction(response))) 
    .catch((error: any) => { 
    console.log('lancamento-effects:'); 
    return Observable.of(new feedback.HttpRequestFailedAction(["Erro ao inserir lançamento"])) 
    }) 

dieser Code über suposed wird eine Fehler Aktion zu senden, die letztlich eine Fehlermeldung auf dem Benutzerbildschirm zeigt.

Eigentlich ist dies geschieht zweimal ..

enter image description here

Auch wird es zweimal auf Konsole ausgegeben.

enter image description here

+0

Hey. Es ist nicht klar, wie Ihr Code organisiert ist. Ihr erster Code-Block zeigt den Hauptteil der Methode 'this.data.request()'? – AngularChef

Antwort

1

Hier einige Code (Plunkr):

@Component({ 
    selector: 'my-app', 
    template: ` 
    <button (click)="subscribe()">Subscribe</button> 
    ` 
}) 
export class AppComponent { 
    obs: Observable<any>; 

    constructor(private http: Http) { 
    // Create the observable ONCE + Share. 
    this.obs = this.http.get('https://httpbin.org/get') 
     .do(() => console.log('***SIDE EFFECT***')) 
     .mapTo('***RESULT***') 
     .share(); 
    } 

    subscribe() { 
    // Subscribe to the same observable TWICE. 
    this.obs.subscribe(val => console.log('subs1', val)); 
    this.obs.subscribe(val => console.log('subs2', val)); 
    } 
} 

Hier ist, was die Konsole zeigt:

***SIDE EFFECT*** 
subs1 ***RESULT*** 
subs2 ***RESULT*** 

Ein Nebeneffekt (das heißt HTTP-Anforderung), zwei Abonnements.

Ist es das wonach Sie suchen?

0

Stellen Sie sicher, dass jeder Abonnent die gleiche hot observable abonniert. Jedes Mal, wenn Sie anrufen:

return this._http.request(new Request(options)) 
    .map((res: Response) => this.refreshToken(res)) 
    .share() 

Sie erstellen eine neue heiße Observable aus einer kalten Observable.

Beispiel den obigen Code unter der Annahme wird in einer Funktion namens foo() gewickelt: Wenn Sie die folgende tun, werden Sie zwei heiße Observablen und 2 http-Anfragen erstellen:

foo().subscribe(...) 
foo().subscribe(...) 

Während das Folgende nur erstellen single hot beobachtbar (und einzelne HTTP-Anfrage):

let hotObs = foo(); 
hotObs.subscribe(...) 
hotObs.subscribe(...); 
Verwandte Themen