Вернуть пустой наблюдаемый

167

Функция 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; 
Мурхаф Сусли
источник

Ответы:

130

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

import 'rxjs/add/observable/empty' 

Observable.empty<Response>();
Андрей Петров
источник
26
Это должно быть теперь import "EmptyObservable" from "rxjs/observable/EmptyObservable";, тогда new EmptyObservable<Response>();.
87

С новым синтаксисом 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({})создает Observableи выдает затем со значением, {}а затем завершает Observable.

Например:

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
SimplGy
@SimplGy да, вы правы, мой плохой для использования take(1)удален для лучшего ответа. @MatthijsWessels, да и нет, только что проверил это сейчас и, если вы это сделаете of(), вернет полную наблюдаемую без испусканияnext
Стивен Лотье
empty теперь устарела, вместо этого используйте EMPTY (используется как константа, а не как метод, см. ответ Simon_Weaver).
EriF89
Пожалуйста, имейте ввиду, что of () не имеет значения. Если вы хотите, вы должны предоставить любое значение, даже неопределенное, или ноль для этого подойдет: of (null) выдает значение (и обрабатывает с помощью методов tap / subscribe), а of () - нет.
Максим Георгиевский
51

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

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

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

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

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

Simon_Weaver
источник
Руководство по обновлению: github.com/ReactiveX/rxjs/blob/master/MIGRATION.md
Simon_Weaver
Если у вас уже есть конфликт, такой как empty()функция, вы можете сказать import { empty as rxEmpty }или, import { empty as _empty }а затем сделать rxEmpty()или _empty(). Конечно, это довольно нестандартная вещь, и я на самом деле не рекомендую ее, но я уверен, что я не единственный, кто был удивлен, RxJS считает, что он достоин импорта таких функций, как ofи emptyв мое пространство имен!
Simon_Weaver
1
будьте осторожны при использовании Angular, потому что есть и то, import { EMPTY } from "@angular/core/src/render3/definition";что совсем не то, что вы хотите. Так что, если вы получаете странные ошибки, убедитесь, что вы не импортируете это по ошибке.
Simon_Weaver
Observable.empty()на самом деле все еще существует, но не рекомендуется в пользу EMPTY.
Александр Абакумов
39

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

import {EmptyObservable} from 'rxjs/observable/EmptyObservable';
...
return new EmptyObservable();
...
Марсель Тиннер
источник
7
включить его сimport {EmptyObservable} from 'rxjs/observable/EmptyObservable';
Kildareflare
получая ошибку, как это, мне нужно настроить что-нибудь в system-config? Необработанный отказ от обещания: (SystemJS) ошибка XHR (404 не найдено) загрузка localhost: 9190 / node_modules / rxjs / Observable / EmptyObservable.js Ошибка: ошибка XHR (404 не найдена) загрузка localhost: 9190 / node_modules / rxjs / Observable / EmptyObservable. js
user630209
29

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

Rx.Observable.empty();

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

Rx.Observable<Response>.from([])
Тоан Нгуен
источник
Я получаю Rx.Observable<{}>не присваивается Observable<Response>, я пытался, Rx.Observable<Response>.empty()но это не сработало
Murhaf Sousli
Я изменил тип возврата на, Observable<any>и это сработало, спасибо, приятель.
Мурхаф Сусли
2
Это должно быть Rx.Observable.from([])без <Response>. В противном случае получим ошибку «выражение ожидается».
Андрей Толстой
2
Вы также можете использовать Rx.Observable.of([]).
Андрей Толстой
1
@AndriyTolstoy Я не уверен, что это эквивалентно. В Observable.of([]), есть одно значение emitted ( []) и поток завершается. При Observable.from([])отсутствии значения поток завершается немедленно.
Pac0
24

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

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

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

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

Андрей Вербицкий
источник
13

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

Observable.of('');

// or
Observable.of({});

// etc
Chybie
источник
2

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

Туонг Ле
источник
1

RxJS 6

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

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

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

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

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

import {Observable,empty} from 'rxjs';
class ActivatedRouteStub {
  params: Observable<any> = empty();
}
Позвонить в
источник
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();
Джоравар Сингх
источник