266 votes

Retourne un Observable vide

La fonction more() est censé retourner 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 je reçois 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);
  }
);

Mise à jour

Dans RXJS 6

import { EMPTY } from 'rxjs'
return EMPTY;

200voto

Stephen Lautier Points 869

Avec la nouvelle syntaxe de RxJS 5.5+, cela devient comme suit :

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

Juste une chose à garder à l'esprit, EMPTY complète l'observable, donc il ne déclenchera pas next dans votre flux, mais ne fait que compléter. Donc si vous avez, par exemple, tap il se peut qu'ils ne se déclenchent pas comme vous le souhaitez (voir un exemple ci-dessous).

Considérant que of({}) crée un Observable et émet le suivant avec une valeur de {} et ensuite il complète le Observable .

Par exemple :

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

5 votes

2 votes

of('foo') émet et complète l'observable immédiatement. rxviz.com/v/0oqMVW1o

1 votes

@SimplGy oui vous avez raison, c'est ma faute pour avoir utilisé take(1) retiré pour une meilleure réponse. @MatthijsWessels, oui et non, je viens juste de le tester et si vous le faites, vous pouvez le faire. of() retournera une observable complète sans émettre next

151voto

Andrei Petrov Points 1046

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

import 'rxjs/add/observable/empty' 

Observable.empty<Response>();

33 votes

Cela devrait maintenant être import "EmptyObservable" from "rxjs/observable/EmptyObservable"; alors new EmptyObservable<Response>(); .

63voto

Simon_Weaver Points 31141

RxJS6 (sans paquet de compatibilité installé)

Il y a maintenant un EMPTY constante et une empty fonction.

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

  var delay = empty().pipe(delay(1000));     
  var delay2 = EMPTY.pipe(delay(1000));

Observable.empty() n'existe plus.

0 votes

0 votes

Si vous avez un conflit tel qu'un empty() fonction déjà vous pouvez dire import { empty as rxEmpty } o import { empty as _empty } et ensuite faire rxEmpty() o _empty() . Bien sûr, c'est une chose assez peu standard à faire et je ne le recommande pas vraiment, mais je suis sûr que je ne suis pas le seul à avoir été surpris que RxJS pense qu'il est digne d'importer des fonctions telles que of y empty dans mon espace de noms !

1 votes

Attention si vous utilisez Angular car il y a aussi import { EMPTY } from "@angular/core/src/render3/definition"; ce qui n'est absolument pas ce que vous voulez. Donc si vous obtenez des erreurs bizarres, assurez-vous que vous n'importez pas cela par erreur.

42voto

Marcel Tinner Points 602

Dans mon cas, avec Angular2 et rxjs, cela a fonctionné avec :

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

7 votes

L'inclure avec import {EmptyObservable} from 'rxjs/observable/EmptyObservable';

0 votes

Je reçois une erreur de ce type. Dois-je configurer quelque chose dans le système-config ? Unhandled Promise rejection : (SystemJS) erreur XHR (404 Not Found) chargement localhost:9190/node_modules/rxjs/Observable/EmptyObservable.js Erreur : Erreur de chargement XHR (404 Not Found) localhost:9190/node_modules/rxjs/Observable/EmptyObservable.js

29voto

Toan Nguyen Points 3342

Oui, il y en a un. Vide opérateur

Rx.Observable.empty();

Pour le script, vous pouvez utiliser from :

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

0 votes

Je reçois Rx.Observable<{}> n'est pas cessible à Observable<Response> J'ai essayé de Rx.Observable<Response>.empty() mais ça n'a pas marché

0 votes

J'ai changé le type de retour en Observable<any> et ça a marché, merci mon pote.

2 votes

Il devrait être Rx.Observable.from([]) sans <Response> . Sinon, on obtient une erreur "expression attendue".

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