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

92

Функция 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() имеет значение true, иначе я получаю сообщение об ошибке, что функция subscribe is not defined 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; 
Теги:
angular
rxjs
observable

11 ответов

95
Лучший ответ

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

import 'rxjs/add/observable/empty' 

Observable.empty<Response>();
  • 15
    Теперь это должен быть import "EmptyObservable" from "rxjs/observable/EmptyObservable"; , затем new EmptyObservable<Response>(); ,
31

С новым синтаксисом, например, 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({}) создает наблюдаемый объект и генерирует следующий со значением {}, он не завершит только наблюдаемое, возможно, вы должны выполнить of({}).pipe(take(1)) для генерации и завершения.

например

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') немедленно испускает и завершает наблюдаемое. rxviz.com/v/0oqMVW1o
Показать ещё 1 комментарий
31

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

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

Да, есть Empty оператор

Rx.Observable.empty();

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

Rx.Observable<Response>.from([])
  • 0
    Я получаю, что Rx.Observable<{}> не может быть назначен для Observable<Response> , я пытался Rx.Observable<Response>.empty() но это не сработало
  • 0
    @MurhafSousli Я добавил код для машинописи
Показать ещё 4 комментария
23

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

Там теперь EMPTY константа и empty функция.

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

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

Observable.empty() больше не существует.

  • 0
    Руководство по обновлению: github.com/ReactiveX/rxjs/blob/master/MIGRATION.md
  • 0
    Если у вас уже есть конфликт, такой как функция empty() вы можете сказать import { empty as rxEmpty } или import { empty as _empty } а затем выполнить rxEmpty() или _empty() . Конечно, это довольно нестандартная вещь, и я на самом деле не рекомендую ее, но я уверен, что я не единственная, кто был удивлен, RxJS считает, что она достойна импорта таких функций, как of и empty в мое пространство имен!
Показать ещё 1 комментарий
9

Несколько способов создать Пустую Наблюдаемую:

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

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

Используйте его на свои нужды)

9

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

Observable.of('');

// or
Observable.of({});

// etc
2

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

0

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

import {Observable,empty} from 'rxjs';
class ActivatedRouteStub {
  params: Observable<any> = empty();
}
  • 0
    работает в угловых 6+
0

RxJS 6

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

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

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

import {from} from 'rxjs';
  • 2
    Это создаст Observable, который предоставит один элемент (пустую строку), поэтому он не выглядит как правильный ответ на этот конкретный вопрос.
0

Попробуйте это

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню