La fonction more()
est censée renvoyer une Observable
partir d’une requête get
export class Collection{ public more = (): Observable => { if (this.hasMore()) { return this.fetch(); } else{ // return empty observable } } private fetch = (): Observable => { return this.http.get('some-url').map( (res) => { return res.json(); } ); } }
Dans ce cas, je ne peux faire une demande que si hasMore()
est vrai, sinon je reçois une erreur sur subscribe()
fonction subscribe is not defined
, comment puis-je retourner une observable vide?
this.collection.more().subscribe( (res) =>{ console.log(res); }, (err) =>{ console.log(err); } )
Dans RXJS 6
import { EMPTY } from 'rxjs' return EMPTY;
Pour typecript, vous pouvez spécifier les parameters génériques de votre observable vide comme ceci:
import 'rxjs/add/observable/empty' Observable.empty();
Dans mon cas avec Angular2 et rxjs, il a travaillé avec:
import {EmptyObservable} from 'rxjs/observable/EmptyObservable'; ... return new EmptyObservable(); ...
Oui, il y a un opérateur vide
Rx.Observable.empty();
Pour dactylographier, vous pouvez utiliser from
:
Rx.Observable.from([])
Avec la nouvelle syntaxe, par exemple rxjs 5.5+, cela devient comme suit:
// 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({});
Juste une chose à garder à l'esprit, empty()
complète l'observable, donc il ne se déclenchera pas dans votre stream, seulement terminé! Donc, si vous avez tap
par exemple, ils pourraient ne pas déclencher comme vous le souhaitez (voir exemple ci-dessous).
tandis que of({})
crée une observable et émet ensuite avec une valeur de {}
, il ne complétera pas l'observable seul, peut-être devriez-vous faire of({}).pipe(take(1))
pour émettre et compléter.
par exemple
empty().pipe( tap(() => console.warn("i will not reach here, as i am complete")) ).subscribe(); of({}).pipe( take(1), tap(() => console.warn("i will reach here")) ).subscribe();
Il y a maintenant une constante EMPTY
et une fonction empty
.
import { Observable, empty, of } from 'rxjs'; var delay = empty().pipe(delay(1000)); var delay2 = EMPTY.pipe(delay(1000));
Observable.empty()
n’existe plus.
Vous pouvez retourner Observable.of (variable_vide), par exemple
Observable.of(''); // or Observable.of({}); // etc
Plusieurs façons de créer une observable vide:
Ils ne font que différer sur la manière dont vous allez l’utiliser (quels événements vont-ils émettre après: complete
, do nothing
), par exemple:
Observable.never()
– n’émet aucun événement et ne se termine jamais. Observable.empty()
– émet seulement complete
. Observable.of({})
– émet à la fois next
et complete
(littéral d’object vide transmis comme exemple). Utilisez-le sur vos besoins exacts)
Ou vous pouvez également essayer ignoreElements()
Essaye ça
export class Collection{ public more (): Observable { 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();
RxJS 6
vous pouvez également utiliser des fonctions comme ci-dessous:
return from([""]);
après l’importation:
import {from} from 'rxjs';
Entré ici avec une question similaire, ce qui précède n’a pas fonctionné pour moi dans: "rxjs": "^6.0.0"
, afin de générer une observable qui n’émet aucune donnée à faire:
import {Observable,empty} from 'rxjs'; class ActivatedRouteStub { params: Observable = empty(); }