javascript - Vraća prazni Observable


Funkcija more() bi trebala vratiti Observable iz get zahtjeva

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();
    });
  };
}

U ovom slučaju mogu napraviti zahtjev samo ako je hasMore() istinito, inače dobivam pogrešku na funkciji subscribe() subscribe nije definiran, kako mogu vratiti prazan Observable?

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

Odgovor #1

S novom sintaksom RxJS 5.5+, ovo postaje sljedeće:

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

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

empty(); // deprecated use EMPTY
EMPTY;
of({});

Samo jedna stvar na umu, EMPTY dovršava observable, pa neće pokrenuti next u vašem streamu, već ga samo dovršava. Dakle, ako imate, na primjer, tap, oni se možda neće pokrenuti kako želite (pogledajte primjer dolje).

Dok of({}) stvara Observable i emitira sljedeću vrijednost {}, a zatim dovršava Observable.

Npr.

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();

Odgovor #2

Za TypeScript možete odrediti generički parametar vašeg praznog observablea ovako:

import 'rxjs/add/observable/empty' 

Observable.empty<Response>();

Odgovor #3

RxJS6 (bez instaliranog paketa za kompatibilnost)

Sada postoji konstanta EMPTY i funkcija empty.

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

  //This is now deprecated
  var delay = empty().pipe(delay(1000));     
  var delay2 = EMPTY.pipe(delay(1000));

Observable.empty() više ne postoji.

Odgovor #4

Više načina za stvaranje praznog Observable-a:

Oni se samo razlikuju u tome kako ćete ga dalje koristiti (koje će događaje emitirati nakon toga: next, complete ili do nothing) npr.:

  • Observable.never() - ne emitira nikakve događaje i nikada ne završava.
  • Observable.empty() - emitira samo complete.
  • Observable.of({}) - emitira i next i complete (Prazni objekt literal je korišten kao primjer).

Koristite ga za svoje točne potrebe)

Odgovor #5

U mom slučaju s Angular2 i rxjs, funkcioniralo je s:

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

Odgovor #6

Budući da su svi odgovori zastarjeli, ovdje ću objaviti ažurirani odgovor

U RXJS >= 6

import { EMPTY } from 'rxjs'
return EMPTY;

Odgovor #7

Da, postoji operator prazno

Rx.Observable.empty();

Za TypeScript, možete koristiti from:

Rx.Observable<Response>.from([])

Odgovor #8

Možete vratiti Observable.of(empty_variable), na primjer

Observable.of('');

// or
Observable.of({});

// etc

Povezani članci