it-swarm.com.de

Wie wird ein leeres in rxjs beobachtbar zurückgegeben?

Die Funktion more() soll eine Observable von einer Get-Anfrage zurückgeben

export class Collection{

    public more = (): Observable<Response> => {
       if (this.hasMore()) {

         return this.fetch();
       }
       else{
         // return empty observable
       }
    }

    private fetch = (): Observable<Response> => {
       return this.http.get('some-url').map(
          (res) => {
              return res.json();
          }
       );
    }
}

In diesem Fall kann ich nur eine Anfrage machen, wenn hasMore() wahr ist, ansonsten bekomme ich einen Fehler in subscribe() function subscribe is not defined. Wie kann ich ein leeres Observable zurücksenden?

this.collection.more().subscribe(
   (res) =>{
       console.log(res);
   },
   (err) =>{
       console.log(err);
   }
)

Aktualisieren

In RXJS 6

import { EMPTY } from 'rxjs'

return EMPTY; 
94
Murhaf Sousli

Für TypeScript können Sie generische Parameter Ihres leeren Observable wie folgt angeben:

import 'rxjs/add/observable/empty' 

Observable.empty<Response>();
97
Andrei Petrov

Mit der neuen Syntax z. rxjs 5.5+ wird dies wie folgt:

// rxjs 6
import { empty, of } from "rxjs";

// rxjs 5.5+ (<6)
import { empty } from "rxjs/observable/empty";
import { of } from "rxjs/observable/of";

empty();
of({});

Nur eine Sache, die Sie beachten sollten: empty() vervollständigt das Beobachtbare, sodass es next in Ihrem Stream nicht auslöst, es wird nur abgeschlossen! Wenn Sie beispielsweise tap haben, werden sie möglicherweise nicht so ausgelöst, wie Sie möchten (siehe Beispiel unten).

während of({}) ein Observable erstellt und als Nächstes mit einem Wert von {} ausstrahlt, wird das Observable nicht alleine abgeschlossen. Vielleicht sollten Sie of({}).pipe(take(1)) tun, um zu emittieren und abzuschließen.

z.B.

empty().pipe(
    tap(() => console.warn("i will not reach here, as i am complete"))
).subscribe();

of({}).pipe(
    tap(() => console.warn("i will reach here and complete"))
).subscribe();
35
Stephen Lautier

In meinem Fall mit Angular2 und RXJS funktionierte es mit:

import {EmptyObservable} from 'rxjs/observable/EmptyObservable';
...
return new EmptyObservable();
...
34
Marcel Tinner

Ja, es gibt einen _ Empty Operator

Rx.Observable.empty();

Für TypeScript können Sie from verwenden:

Rx.Observable<Response>.from([])
28
Toan Nguyen

RxJS6 (ohne Kompatibilitätspaket installiert)

Es gibt jetzt eine EMPTY-Konstante und eine empty-Funktion.

  import { Observable, empty, of } from 'rxjs';

  var delay = empty().pipe(delay(1000));     
  var delay2 = EMPTY.pipe(delay(1000));

Observable.empty() existiert nicht mehr.

23
Simon_Weaver

Mehrere Möglichkeiten, ein leeres Observable zu erstellen:  

Sie unterscheiden sich lediglich darin, wie Sie sie weiter verwenden werden (nach welchen Ereignissen sie ausgegeben wird: next, complete oder do nothing), z.

  • Observable.never() - gibt keine Ereignisse aus und endet nie.
  • Observable.empty() - gibt nurcompleteaus.
  • Observable.of({}) - gibt beidenextundcompleteaus (Leeres Objektliteral, das als Beispiel übergeben wurde).

Verwenden Sie es genau nach Ihren Bedürfnissen)

11

Sie können beispielsweise Observable.of (empty_variable) zurückgeben

Observable.of('');

// or
Observable.of({});

// etc
9
Chybie

Oder Sie können auch ignoreElements() ausprobieren

2
Tuong Le

RxJS 6

sie können auch die folgende Funktion verwenden:

return from<string>([""]);

nach dem import:

import {from} from 'rxjs';
0
Nour

Versuche dies

export class Collection{
public more (): Observable<Response> {
   if (this.hasMore()) {
     return this.fetch();
   }
   else{
     return this.returnEmpty(); 
   }            
  }
public returnEmpty(): any {
    let subscription = source.subscribe(
      function (x) {
       console.log('Next: %s', x);
    },
    function (err) {
       console.log('Error: %s', err);
    },
    function () {
       console.log('Completed');
    });
    }
  }
let source = Observable.empty();
0
Jorawar Singh

Kam hier mit einer ähnlichen Frage, das Obige funktionierte für mich nicht in: "rxjs": "^6.0.0", um ein Observable zu generieren, das keine Daten aussendet, die ich machen musste:

import {Observable,empty} from 'rxjs';
class ActivatedRouteStub {
  params: Observable<any> = empty();
}
0
Callat