빈 Observable을 반환


167

이 함수 more()Observableget 요청에서 를 반환해야합니다.

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()function에 오류가 발생 subscribe is not defined합니다. 빈 observable을 어떻게 반환 할 수 있습니까?

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

최신 정보

RXJS 6에서

import { EMPTY } from 'rxjs'

return EMPTY; 

답변:


130

typescript의 경우 다음과 같이 빈 관측 가능의 일반 매개 변수를 지정할 수 있습니다.

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
스티븐 Lautier

empty는 이제 더 이상 사용되지 않습니다. 대신 EMPTY를 사용하십시오 (메소드 대신 상수로 사용됨, Simon_Weaver의 답변 참조).
EriF89

of ()는 어떤 값도 방출하지 않습니다. 원하는 경우 undefined 또는 null이라도 해당 값을 제공해야합니다. of (null)은 값을 내보내고 (탭 / 구독 메소드로 처리) of ()는 그렇지 않습니다.
Maxim Georgievskiy

51

RxJS6 (호환성 패키지가 설치되지 않은 상태)

이제 EMPTY상수와 empty함수가 있습니다.

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

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

Observable.empty() 더 이상 존재하지 않습니다.



empty()이미 기능 과 같은 충돌이있는 경우 import { empty as rxEmpty }or 를 말한 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.
Alexander Abakumov

39

Angular2와 rxjs의 경우에는 다음과 같이 작동했습니다.

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

7
포함 :import {EmptyObservable} from 'rxjs/observable/EmptyObservable';
Kildareflare

이와 같은 오류가 발생하면 system-config에서 아무것도 구성해야합니까? 처리되지 않은 약속 거부 : (host.9190 / node_modules / rxjs / Observable / EmptyObservable.js를 로드하는 (SystemJS) XHR 오류 (404를 찾을 수 없음) 오류 : localhost를
user630209

29

예, 연산자가 있습니다

Rx.Observable.empty();

typescript의 경우 다음을 사용할 수 있습니다 from.

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

Rx.Observable<{}>할당 할 수 없습니다 Observable<Response>, 시도 Rx.Observable<Response>.empty()했지만 작동하지 않습니다
Murhaf Sousli

반품 유형을로 변경 Observable<any>했으며 친구에게 감사했습니다.
Murhaf Sousli

2
그것은해야 Rx.Observable.from([])하지 <Response>. 그렇지 않으면 "표현 예상"오류가 발생합니다.
Andriy Tolstoy

2
을 사용할 수도 있습니다 Rx.Observable.of([]).
Andriy Tolstoy

1
@AndriyTolstoy 이것이 동등한 지 확실하지 않습니다. 에 Observable.of([])방출 된 하나의 값 ( [])이 있고 스트림이 완료됩니다. 을 사용하면 Observable.from([])값이 방출되지 않고 스트림이 즉시 완료됩니다.
Pac0

24

Empty Observable을 만드는 몇 가지 방법 :

그것들은 당신이 그것을 어떻게 더 사용할 것인가 (다음에 어떤 이벤트가 발생할지 : next, complete또는 do nothing)에 따라 다릅니다 .

  • Observable.never() -이벤트가 발생하지 않으며 끝나지 않습니다.
  • Observable.empty()-방출 만합니다 complete.
  • Observable.of({})- nextcomplete(예 : 빈 객체 리터럴이 전달됨)을 모두 방출합니다 .

정확한 요구에 사용하십시오)


13

예를 들어 Observable.of (empty_variable)을 반환 할 수 있습니다.

Observable.of('');

// or
Observable.of({});

// etc


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();
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.