Повернути порожнє спостереження


167

Ця функція more()повинна повертати запит Observableна отримання

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 (використовується як константа замість як метод, див. відповідь Simon_Weaver).
EriF89

Зауважте, що () не містить жодного значення. Якщо ви хочете його, ви повинні надати будь-яке значення, навіть невизначене або null, це нормально для цього: 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() більше не існує


Посібник з оновлення: 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';
Кілдарефларе

отримую помилку на зразок цієї, чи потрібно мені щось налаштовувати в конфігурації системи? Необов’язане відхилення обіцянки: (SystemJS) Помилка XHR (404 не знайдено) завантаження localhost: 9190 / node_modules / rxjs / спостерігається / EmptyObservable.js Помилка: помилка XHR (404 не знайдено) при завантаженні localhost: 9190 / node_modules / rxjs / Observable / EmptyObservable. js
user630209

29

Так, є оператор Am Empty

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([]), є одне значення, яке випромінюється ( []), і потік завершується. З 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


1

RxJS 6

Ви також можете використовувати функцію, як показано нижче:

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

після імпорту:

import {from} from 'rxjs';

2
Це створить спостережуваний, який забезпечить один елемент (порожній рядок), тому це не схоже на належну відповідь на це конкретне питання.
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();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.