2016-07-24 3 views
47

Функции more() должен возвращать Observable из запроса GETКак вернуть пустую наблюдаемый в rxjs

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); 
    } 
) 
+0

У вас есть решение? можете ли вы написать, что есть в этом .hasMore() – Rohitesh

+0

@Rohitesh 'hasMore() {return currentPage

ответ

60

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

Observable.empty<Response>(); 
20

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

Rx.Observable.empty(); 

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

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

Я получаю' 'Rx.Observable <{}> не может быть назначен на' 'Наблюдаемые , я попытался' Rx.Observable .empty() ', но это не сработало –

+0

@MurhafSousli Я добавил код для машинописи –

+0

Я изменил тип возврата на «Наблюдаемый », и он сработал, спасибо помощнику. –

6

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

Observable.of(''); 

// or 
Observable.of({}); 

// etc 
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(); 
1

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

22

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

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

включить его с 'import {EmptyObservable} из 'rxjs/observable/EmptyObservable';' – Kildareflare

+0

получить ошибку, как это, мне нужно настроить что-либо в системном config? Unhandled Promise rejection: (SystemJS) Ошибка XHR (404 не найдена) загрузка http: // localhost: 9190/node_modules/rxjs/Observable/EmptyObservable.js \t Ошибка: ошибка XHR (404 не найдена) загрузка http: // localhost : 9190/node_modules/rxjs/Наблюдаемые/EmptyObservable.js – user630209

8

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

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(
    take(1), 
    tap(() => console.warn("i will reach here")) 
).subscribe(); 
Смежные вопросы