webentwicklung-frage-antwort-db.com.de

RxJS: Observable.create () vs. Observable.from ()

Was ist der Unterschied zwischen diesen beiden?

return Observable.create(function(observer) {
    if (array)
        observer.next([]);
    else
        observer.next(null);
    observer.complete();
});

und 

return Observable.from( array ? [] : null );

Ich dachte, es könnte dasselbe sein, funktionierte aber nicht.

7
Ondra Žižka

Die create(...) ist eine generische Observable Factory-Methode zum Erstellen einer Observable, in der Sie explizit festlegen, wie Werte an die Subscriber übergeben werden.

Wenn Sie beispielsweise eine Zeitgeberbasis Observable erstellen (existiert diese nicht bereits als Observable.timer), können Sie Folgendes tun:

   Observable.create(observer => {
     const timeoutId = setTimeout(() => {
       observer.next(0);
       observer.complete();
     }, 500);

     return () => clearTimeout(timeoutId);
   });

Die from(...) ist das, was ich als conformance - Operator bezeichne, indem versucht wird, einen übergebenen Datentyp in eine Observable zu zwingen (macht sie konform). Das bedeutet, dass eine Vielzahl von Typen akzeptiert und in Observables konvertiert werden kann. Diese Typen umfassen:

  • Arrays
  • Versprechen
  • Generatoren
  • Beobachtbare Dinge

Es gibt auch spezielle Konverter, die Sie finden können, wie fromArray und fromPromise, die diese Typen spezifisch konvertieren, from jedoch eher ein Schweizer Taschenmesser dieser Methoden

Wenn Sie nur einen einzelnen Wert benötigen, sollten Sie Observable.of verwenden (die Dokumente scheinen veraltet zu sein, just/return wurde in RxJS 5 in of umbenannt und ich glaube nicht, dass sie einen Alias ​​mehr haben).

d.h.

// Don't quote me on the import part
import 'rxjs/add/observable/of';

Observable.of(1, 2, 3, 4).subscribe();
15
paulpdaniels

Wenn Sie ein Array zurückgeben, wird einmal das gesamte Array auf einmal von 'create/next' emittiert, aber von 'from' wird jedes Element so oft ausgegeben wie seine Länge, also für den Abonnenten.

Observable.create(observer => observer.next(myArray)) wird einmalig das onNext-Ereignis ausgelöst, um myArray zurückzugeben, während Observable.from(myArray) viele onNext-Ereignisse ausgeben wird, um jedes Mal ein Element zurückzugeben. 

0
bob

Ein Unterschied ist: Observable.from() verbietet null ausdrücklich als etwas, das er akzeptiert. Die erste ist eine Art Problemumgehung, um eine beobachtbare Rückgabe von null zu erstellen. (Siehe die akzeptierte Antwort für den Hauptunterschied.)

Besserer (kürzerer) Weg wäre die Verwendung von nur :

return Observable.just( array ? [] : null );

Aber ich konnte nicht finden, wo ich es kaufen oder importieren kann.

import 'rxjs/add/operator/just';

Dies ist in meiner Distribution von rxjs nicht vorhanden.
Edit: just wurde in of umbenannt, siehe akzeptierte Antwort.

0
Ondra Žižka

Observable.from ():
Sie haben eine Liste von Werten (die nichts mit Rx zu tun hat) und ein Observable wird erstellt - aus dieser Liste. Wenn ein Observer dieses Observable abonniert, wird die Liste der Werte nacheinander als Next () - Ereignisse übergeben. Anschließend wird Completed () übergeben, und Sie können diesen Prozess nicht steuern.

Observable.create ():
Sie erstellen ein Observable, indem Sie eine Liste von Ereignissen (nicht Werten) an Ihre Observer übergeben. Sie haben die Kontrolle über die Reihenfolge der Ereignisse. Wenn Sie onCompleted nicht aufgerufen haben, wird es nicht automatisch aufgerufen. Sie können onError absichtlich zwischen zwei Ereignissen aufrufen (zum Testen).

0
Tony