Warum takeUntil ist notwendig, in diesem ngrx Beispiel?

In diesem rxjs Beispiel, ein takeUntil wird in der switchMap Abschnitt. Habe ich es entfernt und die beobachtbaren funktioniert einwandfrei.

Warum die takeUntil und die nextSearch$ notwendig sind, in diesem Beispiel?

@Injectable()
export class BookEffects {

  @Effect()
  search$: Observable<Action> = this.actions$
    .ofType(book.ActionTypes.SEARCH)
    .debounceTime(300)
    .map(toPayload)
    .switchMap(query => {
      if (query === '') {
        return empty();
      }

      const nextSearch$ = this.actions$.ofType(book.ActionTypes.SEARCH).skip(1);

      return this.googleBooks.searchBooks(query)
        .takeUntil(nextSearch$)
        .map(books => new book.SearchCompleteAction(books))
        .catch(() => of(new book.SearchCompleteAction([])));
    });

    constructor(private actions$: Actions, private googleBooks: GoogleBooksService) { }
}



One Reply
  1. 4

    Den takeUntil hier ist die Umrechnung der Beobachtbaren zurückgegeben GoogleBooksService.searchBooks() auf eine neue Observable, die unterbrochen werden (d.h. vorzeitig abgeschlossen), wenn die Hilfs-beobachtbare strahlt nichts (eine neue Suchanfrage Aktion durch den Benutzer, durch die Blicke von ihm), bevor searchBooks gibt ein Ergebnis zurück, um wirksam zu verhindern, das Abonnement zu je trigger. Es wird nicht einen Unterschied machen, wenn die http-Anforderung, die hinter searchBooks beendet, bevor der Benutzer eine neue Anforderung, die auch den zu beobachten, aber nur nach auslösen des Abonnements. Sollte dies der Fall sein 95% der Zeit.

    Den takeUntil wartet, bis eine zweite Beobachtbare strahlt etwas (hier wäre dies der nächsten – SUCHE-Aktion durch Benutzer, vermute ich, mit der aktuellen eine übersprungen mit skip(1)) und dann schließt das Beobachten, zerstören Sie das Abo, bevor es ausgelöst wird, weil wahrscheinlich ein neues BookEffects wird instanziiert, um aufzupassen, dass die neue Suche.

    Disclaimer: ich habe das nicht gehen durch alle der Quellcode der Anwendung, so manches ist Spekulation, aber ich bin zuversichtlich, es geht in die richtige Richtung, mindestens.

    • Ob oder nicht die beobachtbaren zurückgegeben searchBooks heiß oder kalt, ist nicht relevant; es ist oder nicht, ob es abgeschlossen ist, das ist wichtig. Und takeUntil wird verwendet, um sicherzustellen, dass es abgeschlossen wird. BTW, searchBooks realisiert Http service, das gibt einen kalten beobachtbar ist – das ist kein HTTP-request gemacht wird, bis subscribe genannt wird.
    • Du hast Recht, ich war zu schnell davon ausgehen, es würde ein heißer beobachten, diese sind am häufigsten diejenigen, die Sie benötigen, um sicherzustellen, abgeschlossen. Die Kernaufgabe des takeUntil bereits in meiner Antwort noch richtig ist, obwohl es nicht verhindern, dass die keine Speicher-Lecks hier doch eher nur die flackernden Suchergebnissen oder so…
    • Ja, der Kern Ihrer Antwort richtig ist. Ich wollte nur klarstellen das heiß – /kalt Problem.
    • Ich habe bearbeitet Sie meine Antwort unter dieser Berücksichtigung und die Fokussierung auf das Kerngeschäft.
    • Ich habe eine do Methode und protokolliert die Reihenfolge. Ich sehe, dass, wenn ich nicht verwenden, takeUntil, die google-API aufgerufen wird, für das was ich geben, egal wie schnell ich tippe. Wenn ich takeUntil, und geben Sie schnell, ich sehe nur einen Aufruf der google-API.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.