2016-07-24 14 views
47

funkcji more() ma zwrócić Observable od żądania GETJak zwrócić pusty obserwowalne w 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(); 
      } 
     ); 
    } 
} 

W tym przypadku mogę zrobić tylko wniosek, jeśli hasMore() jest prawdą, inaczej pojawia się błąd na subscribe() funkcji subscribe is not defined, jak mogę zwrócić puste obserwowalne?

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

Masz już swoje rozwiązanie? czy możesz napisać, co jest w tym.hasMore() – Rohitesh

+0

@Rohitesh 'hasMore() {return currentPage

Odpowiedz

60

Na maszynie można określić ogólny param twoich pusty obserwowalne tak:

Observable.empty<Response>(); 
20

Tak, to ja Empty operator

Rx.Observable.empty(); 

Na maszynie można użyć from:

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

Otrzymuję' Rx.Observable <{}> 'nie można przypisać do' Observable ', próbowałem' Rx.Observable .empty() 'ale to nie zadziałało –

+0

@MurhafSousli Dodałem kod maszynopisu –

+0

Zmieniłem typ zwrotu na "Observable " i zadziałało, dzięki kolego. –

6

Możesz powrócić Observable.of (empty_variable), na przykład

Observable.of(''); 

// or 
Observable.of({}); 

// etc 
0

Spróbuj

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

Albo można spróbować ignoreElements() także

22

W moim przypadku z Angular2 i rxjs , działało z:

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

dołącza to do 'importu {EmptyObservable} z 'rxjs/obserservable/EmptyObservable';' – Kildareflare

+0

otrzymuję taki błąd, czy muszę skonfigurować cokolwiek w system-config? Nieobsługiwane odrzucenie obietnicy: (SystemJS) Błąd XHR (404 nie znaleziono) ładowanie http: // localhost: 9190/node_modules/rxjs/Observable/EmptyObservable.js \t Błąd: Błąd XHR (404 nie znaleziono) loading http: // localhost : 9190/node_modules/rxjs/Observable/EmptyObservable.js – user630209

8

Dzięki n nowa składnia np. rxjs 5.5+, staje się to w następujący sposób:

import { empty } from "rxjs/observable/empty"; 
import { of } from "rxjs/observable/of"; 

empty(); 
of({}); 

Tylko jedna rzecz, aby pamiętać, empty() zakończeniu obserwowalne, więc nie spowoduje next w strumieniu, tylko kończy! Więc jeśli masz na przykład tap, mogą nie zostać uruchomione, jak chcesz (patrz przykład poniżej).

natomiast of({}) tworzy zauważalny i emituje obok o wartości {}, to nie zakończy się zaobserwować sam, być może należy zrobić of({}).pipe(take(1)) emitować oraz kompletne.

np.

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(); 
Powiązane problemy