2017-09-22 22 views
1

Ich habe ein Tutorial auf Rxjs wie folgt gesehen.Rxjs: take (1) Verwendung

Meine Frage ist:
1) Was ist die Verwendung von take(1) hier? Ich sehe viele Erklärungen online, aber ich verstehe es nicht wirklich. Außerdem sehe ich keinen Vorteil der Verwendung von take(1) in diesem Code. Und der Autor verwendet take(1) für jede Rückgabe-Funktion in REST API-Service.

2) Der Autor hat sich nach dem Abonnieren nicht abgemeldet. Liegt es daran, dass der Autor take(1) verwendet und daher das manuelle Abmelden nicht benötigt wird?

3) Was ist, wenn ich Fangfunktion implementieren möchte. Sollte ich es vor dem Nehmen oder nach dem Nehmen implementieren.

getProfile() { // this is a call to REST API 
    return this.service.getProfile() 
      .map(res => res.json()) 
      .take(1) 
    } 
} 

this.data.getProfile().subscribe(profile => { 
    this.userProfile = profile; 
}); 

Antwort

2

Der Autor abmelden nicht nach abonnieren. Liegt es daran, dass die Autorin nimm (1) also manuelle Abmeldung nicht benötigt wird?

Ja, das ist sehr wahrscheinlich, warum der Autor take(1) Betreiber verwendet. Es ist Aufgabe, einen Wert an ein Observable zu übergeben und sich dann von der Quelle abzumelden. Aber abhängig von der Dienstleistung ist es möglicherweise nicht erforderlich.

Zum Beispiel in Angular der HttpClient Service vervollständigt den Stream von selbst nach dem Senden der endgültigen HttpResponse Ereigniswert, so dass Sie weder take verwenden müssen, noch explizit abmelden. Here is the sources:

@Injectable() 
export class HttpXhrBackend implements HttpBackend { 
    ... 
    handle(req: HttpRequest<any>): Observable<HttpEvent<any>> { 
    ... 
    // Everything happens on Observable subscription. 
    return new Observable((observer: Observer<HttpEvent<any>>) => { 
     ... 
     // First up is the load event, which represents a response being fully available. 
     const onLoad =() => { 
     ... 
     if (ok) { 
      // A successful response is delivered on the event stream. 
      observer.next(new HttpResponse({ 
      body, 
      headers, 
      status, 
      statusText, 
      url: url || undefined, 
      })); 
      // The full body has been received and delivered, no further events 
      // are possible. This request is complete. 
      observer.complete(); <--------------------------------- 
     } 

Was passiert, wenn ich fangen Funktion implementieren möchten. Sollte ich es vor dem Nehmen oder nach dem Nehmen implementieren.

Sie können es nach take implementieren, da take auch den Fehler überträgt.

const stream = Observable.create((observer) => { 
    observer.error(new Error()); 
}).take(1).catch(() => { 
    return Observable.of(`An error occurred`); 
}).subscribe((v) => { 
    console.log(v); // An error occurred 
}) 
+0

Danke für die Klarstellung. Gibt es irgendwelche Dokumentation darüber, dass es keinen Grund gibt, die Abmeldung explizit aufzurufen, auch ohne 'take (1)' für den eckigen Dienst 'HttpClient', um Ihre Anweisung zu sichern? – stackdisplay

+0

Für die Dokumentation, nehmen Sie (verzeihen Sie das Wortspiel) einen Blick auf den [* Observable Contract *] (http://reactivex.io/documentation/contract.html). Es ist definitiv. 'take' vervollständigt das beobachtbare und completion sieht alle Abonnenten automatisch abgemeldet. – cartant

+1

@stackdisplay, aktualisiert die Antwort. Die beste Dokumentation ist die Quellen :). Schauen Sie sich angularindepth.com an, wo alle Artikel mit diesem Motto veröffentlicht werden. –