180 votes

Comment retourner un observable vide dans rxjs

La fonction more() est supposée renvoyer un Observable partir d'une requête get

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

Dans ce cas, je ne peux faire une demande que si hasMore() est vrai, sinon j'obtiens une erreur sur subscribe() fonction subscribe is not defined , comment puis-je retourner un 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; 
 

135voto

Andrei Petrov Points 1046

Pour le manuscrit, vous pouvez spécifier le paramètre générique de votre observable vide comme ceci:

 import 'rxjs/add/observable/empty' 

Observable.empty<Response>();
 

99voto

Stephen Lautier Points 869

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 le observable, afin de ne pas déclencher next dans votre flux, seulement remplit! Donc, si vous avez tap , par exemple, ils pourraient ne pas obtenir de déclenchement que vous le souhaitez (voir exemple ci-dessous).

alors qu' of({}) crée un observables et émet ensuite avec une valeur de {}, il ne sera pas complète observables seul, peut-être que vous devriez faire of({}).pipe(take(1)) d'émettre et complète.

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

52voto

Simon_Weaver Points 31141
<h3>RxJS6 (sans pack de compatibilité installé)<p>Il y a maintenant une <code></code> constante et une <code></code> fonction.</p><pre><code></code></pre><p><code></code>n’existe plus.</p></h3>

40voto

Marcel Tinner Points 602

Dans mon cas avec Angular2 et rxjs, cela fonctionnait avec:

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

29voto

Toan Nguyen Points 3342

Oui, il y a un opérateur vide

 Rx.Observable.empty();
 

Pour le manuscrit, vous pouvez utiliser from :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X