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; 

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

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


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



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

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([])

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)


13

Puede devolver Observable.of (empty_variable), por ejemplo

Observable.of('');

// or
Observable.of({});

// etc


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';

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

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();
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.