2016-10-19 1 views
0

Ich versuche, das Verhalten der Observable von angular2 http.get() -Methode zurückgegeben zu verstehen. Mein entsprechender Code ist hier ...Shared Observable Fehlerbehandlung Problem

let observable = this.http.get(this.url) 
if (this.share) { 
    observable = observable.share(); 
} 

if (this.firstHandle) { 
    observable.subscribe(result => { 
    this.result = result._body; 
    }, 
    err => { 
    this.error = err; 
    }); 
} else { 
    observable.subscribe(result => { 
    this.result = result._body; 
    }); 
} 

observable.subscribe(result => { 
    this.result2 = result._body 
}, 
err => { 
    this.error2 = err; 
}) 

Wenn this.share wahr ist und this.firstHandle falsch ist dann der obige Code verhält sich nicht wie ich erwarten würde. Der Fehler wird im zweiten Abonnementanruf nicht behandelt. Alle anderen Fälle verhalten sich wie erwartet. Hier ist eine plunkr zeigt das Verhalten. Beachten Sie, dass der letzte Fall den Fehler eines ungültigen Anrufs nicht anzeigt. Ich versuche nur den Grund dafür zu verstehen.

Vielen Dank im Voraus.

Antwort

0

Ich lerne das immer noch selbst. Ich schaute auf die share method in the RxJS library und es sieht aus wie das erste Mal, dass Sie subscribe abonnieren, ist das einzige Mal, dass es tatsächlich ein neues Abonnement erstellt. Wenn Sie das zweite Mal subskribieren, werden nur die Daten geteilt und es wird kein neues Abonnement erstellt. Ich denke also, dass der Fehlerbehandlungsparameter in Ihrem zweiten Abonnement nicht angezeigt wird.

+0

Aber das ist das Seltsame. Es ** sieht ** ** wenn ** ich den Fehler im ersten Abonnement behandle, ** ** nicht ** wenn ich nicht. Es scheint mir, dass die Logik, die sie verwendeten, war, wenn Ihr erster Abonnent nicht an dem Fehler interessiert ist, als kein anderer Abonnent. Ich verstehe das nicht. – crowmagnumb

+0

Ich denke, Share könnte einen anderen Zweck in RxJS haben. Ich denke, der Effekt, nach dem Sie suchen, könnte sein, dass Sie ein Connectable Observable erstellen und den Publish-Operator dafür verwenden. Wieder bin ich im selben Boot, um zu versuchen, meinen Kopf um all das neue Zeug Angular 2 zu wickeln. – Frank