Как вернуть пустое наблюдаемое в rxjs


функции more() получилось Observable из запроса 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();
          }
       );
    }
}

в данном случае я могу только сделать запрос, если hasMore() Это правда, иначе я получаю ошибку на subscribe() функции subscribe is not defined, как я могу вернуть пустой заметный?

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

обновление

в RXJS 6

import { EMPTY } from 'rxjs'

return EMPTY; 
11 78

11 ответов:

для typescript вы можете указать общий параметр вашего пустого наблюдаемого следующим образом:

import 'rxjs/add/observable/empty' 

Observable.empty<Response>();

в моем случае с Angular2 и rxjs, он работал с:

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

Да, есть am пустой оператор

Rx.Observable.empty();

для typescript, вы можете использовать from:

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

С новым синтаксисом, например, rxjs 5.5+, это становится следующим:

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

только одна вещь, чтобы иметь в виду,empty() завершает наблюдаемое, поэтому он не будет запускать next в вашем потоке, только завершает! Так что если у вас есть tap например, они не могут сделать триггер, как вы хотите (см. пример ниже).

, тогда как of({}) создает наблюдаемый и выдает next со значением {}, это не будет завершить наблюдаемое в одиночку, возможно, вы должны сделать of({}).pipe(take(1)) to испускают и завершают.

например

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

RxJS6 (без установленного пакета совместимости)

сейчас EMPTY постоянный и

вы можете вернуть Observable.of(empty_variable), например

Observable.of('');

// or
Observable.of({});

// etc

несколько способов создать пустой наблюдаемый:

они просто отличаются от того, как вы собираетесь использовать его в дальнейшем (какие события он будет излучать после: next,complete или do nothing) например:

  • Observable.never() - не испускает никаких событий и никогда не заканчивается.
  • Observable.empty() - выдает только complete.
  • Observable.of({}) - излучает как next и complete (пустой литерал объекта, переданного в качестве примера).

использовать его на ваших точных потребностей)

или вы можете попробовать ignoreElements() а также

попробуй такое

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

RxJS 6

вы также можете использовать такие функции, как показано ниже:

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

после импорта:

import {from} from 'rxjs';

пришел сюда с аналогичным вопросом, выше не работает для меня в: "rxjs": "^6.0.0", чтобы создать наблюдаемый, который не выдает никаких данных, которые мне нужно было сделать:

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