Devuelve un observable vacío

167

Se more()supone que la función devuelve una Observablesolicitud 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();
          }
       );
    }
}

En este caso, solo puedo hacer una solicitud si hasMore()es verdadera, de lo contrario, obtengo un error en la subscribe()función subscribe is not defined, ¿cómo puedo devolver un observable vacío?

this.collection.more().subscribe(
   (res) =>{
       console.log(res);
   },
   (err) =>{
       console.log(err);
   }
)

Actualizar

En RXJS 6

import { EMPTY } from 'rxjs'

return EMPTY; 
Murhaf Sousli
fuente

Respuestas:

130

Para el mecanografiado puede especificar el parámetro genérico de su observable vacío como este:

import 'rxjs/add/observable/empty' 

Observable.empty<Response>();
Andrei Petrov
fuente
26
Esto debería ser ahora import "EmptyObservable" from "rxjs/observable/EmptyObservable";, entonces new EmptyObservable<Response>();.
87

Con la nueva sintaxis de RxJS 5.5+, esto se convierte en lo siguiente:

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

Solo una cosa a tener en cuenta, empty()completa lo observable, por lo que no se activará nexten su transmisión, sino que solo se completará. Entonces, si tiene, por ejemplo, tapes posible que no se activen como desee (vea un ejemplo a continuación).

Mientras que of({})crea un Observabley emite a continuación con un valor de {}y luego completa elObservable .

P.ej:

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();
Stephen Lautier
fuente
1
of('foo')emite y completa el observable inmediatamente. rxviz.com/v/0oqMVW1o
SimplGy
@SimplGy sí, tienes razón, es malo usarlo take(1)eliminado para una mejor respuesta. @MatthijsWessels, sí y no, acabo de probar esto ahora y, si lo haces of(), devolverás un observable completo sin emitirlonext
Stephen Lautier
vacío ahora está en desuso, use VACÍO en su lugar (usado como una constante en lugar de como un método, vea la respuesta de Simon_Weaver).
EriF89
Tenga en cuenta que of () no emite ningún valor. Si desea uno, debe proporcionar cualquier valor, incluso indefinido o nulo está bien para eso: of (null) emite el valor (y procesa con métodos tap / subscribe), mientras que of () no.
Maxim Georgievskiy
51

RxJS6 (sin paquete de compatibilidad instalado)

Ahora hay una EMPTYconstante y una emptyfunción.

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

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

Observable.empty() ya no existe

Simon_Weaver
fuente
Guía de actualización: github.com/ReactiveX/rxjs/blob/master/MIGRATION.md
Simon_Weaver
Si ya tiene un conflicto, como una empty()función, puede decir import { empty as rxEmpty }o import { empty as _empty }y luego hacer rxEmpty()o_empty() . Por supuesto, eso es algo bastante poco estándar y no lo estoy recomendando, pero estoy seguro de que no soy el único que se sorprendió. ¡RxJS cree que es digno de importar funciones como ofy emptyen mi espacio de nombres!
Simon_Weaver
1
import { EMPTY } from "@angular/core/src/render3/definition";tenga cuidado si usa Angular porque también hay algo que no es completamente lo que desea. Entonces, si obtiene errores extraños, asegúrese de no importarlos por error.
Simon_Weaver
Observable.empty() Realmente todavía existe pero está en desuso a favor de EMPTY.
Alexander Abakumov el
39

En mi caso con Angular2 y rxjs, funcionó con:

import {EmptyObservable} from 'rxjs/observable/EmptyObservable';
...
return new EmptyObservable();
...
Marcel Tinner
fuente
77
import {EmptyObservable} from 'rxjs/observable/EmptyObservable';
inclúyelo
obteniendo un error como este, ¿DEBO configurar algo en system-config? Rechazo de promesa no manejada: error XHR (SystemJS) (404 no encontrado) al cargar localhost: 9190 / node_modules / rxjs / Observable / EmptyObservable.js Error: error XHR (404 no encontrado) al cargar localhost: 9190 / node_modules / rxjs / Observable / EmptyObservable. js
user630209
29

Sí, hay un operador vacío

Rx.Observable.empty();

Para el mecanografiado, puede usar from:

Rx.Observable<Response>.from([])
Toan Nguyen
fuente
Lo que estoy recibiendo Rx.Observable<{}>no es asignable Observable<Response>, lo intenté Rx.Observable<Response>.empty()pero no funcionó
Murhaf Sousli
Cambié el tipo de retorno a Observable<any>y funcionó, gracias amigo.
Murhaf Sousli
2
Debería estar Rx.Observable.from([])fuera <Response>. De lo contrario, aparece un error "expresión esperada".
Andriy Tolstoy
2
También puedes usar Rx.Observable.of([]).
Andriy Tolstoy
1
@AndriyTolstoy No estoy seguro de que esto sea equivalente. En Observable.of([]), hay un valor emitido ( []) y luego la secuencia se completa. Con Observable.from([]), no se emite ningún valor, la secuencia se completa inmediatamente.
Pac0
24

Varias formas de crear un Observable vacío:

Simplemente difieren en cómo lo va a usar más (qué eventos emitirá después de next, completeo do nothing) por ejemplo:

  • Observable.never() - No emite eventos y nunca termina.
  • Observable.empty()- solo emite complete.
  • Observable.of({})- emite ambos nexty complete(objeto literal literal pasado como ejemplo).

Úselo en sus necesidades exactas)

Andrii Verbytskyi
fuente
13

Puede devolver Observable.of (empty_variable), por ejemplo

Observable.of('');

// or
Observable.of({});

// etc
Chybie
fuente
2

O puedes intentarlo ignoreElements()también

Tuong Le
fuente
1

RxJS 6

puede usar también desde la función como a continuación:

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

después de la importación:

import {from} from 'rxjs';
Nour
fuente
2
Esto creará un Observable que proporcionará un elemento (una cadena vacía), por lo que no parece una respuesta adecuada a esta pregunta específica.
BrunoJCM
1

Vine aquí con una pregunta similar, lo anterior no funcionó para mí: "rxjs": "^6.0.0"para generar un observable que no emita ningún dato que deba hacer:

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

Prueba esto

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();
Jorawar Singh
fuente