Comment retourner une observable vide dans rxjs

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

Mettre à jour

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

RxJS6 (sans package de compatibilité installé)

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