web-dev-qa-db-fra.com

Comment retourner un observable vide dans rxjs

La fonction more() est supposée renvoyer une 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);
   }
)

Mettre à jour

Dans RXJS 6

import { EMPTY } from 'rxjs'

return EMPTY; 
94
Murhaf Sousli

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

import 'rxjs/add/observable/empty' 

Observable.empty<Response>();
97
Andrei Petrov

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

Une chose à garder à l'esprit, empty() complète l'observable, de sorte qu'il ne déclenche pas next dans votre flux, mais le complète! Ainsi, si vous avez par exemple tap, ils ne seront peut-être pas déclenchés comme vous le souhaitez (voir l'exemple ci-dessous).

alors que of({}) crée un 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(
    tap(() => console.warn("i will reach here and complete"))
).subscribe();
35
Stephen Lautier

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

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

Oui, il y a un vide opérateur

Rx.Observable.empty();

Pour TypeScript, vous pouvez utiliser from:

Rx.Observable<Response>.from([])
28
Toan Nguyen

RxJS6 (sans package de compatibilité installé)

Il existe 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.

23
Simon_Weaver

Plusieurs façons de créer un observable vide:  

Ils diffèrent simplement par la manière dont vous allez l'utiliser (quels événements seront émis après: next, complete ou do nothing), par exemple:

  • Observable.never() - n'émet aucun événement et ne se termine jamais.
  • Observable.empty() - n'émet quecomplete.
  • Observable.of({}) - émet deuxnextetcomplete(littéral d'objet vide transmis à titre d'exemple).

Utilisez-le sur vos besoins exacts)

11
Andrii Verbytskyi

Vous pouvez retourner Observable.of (empty_variable), par exemple

Observable.of('');

// or
Observable.of({});

// etc
9
Chybie

Ou vous pouvez aussi essayer ignoreElements()

2
Tuong Le

RxJS 6

vous pouvez également utiliser les fonctions suivantes:

return from<string>([""]);

après importation:

import {from} from 'rxjs';
0
Nour

Essaye ça

export class Collection{
public more (): Observable<Response> {
   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();
0
Jorawar Singh

Venu 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 un observable n'émettant aucune donnée que je devais faire:

import {Observable,empty} from 'rxjs';
class ActivatedRouteStub {
  params: Observable<any> = empty();
}
0
Callat