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 samocomplete.Observable.of({})- emitira inexticomplete(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
