Observable.of는 함수가 아닙니다


192

Observable.of프로젝트에서 가져 오기 기능에 문제가 있습니다. 내 Intellij는 모든 것을 본다. 내 코드에는 다음이 있습니다.

import {Observable} from 'rxjs/Observable';

내 코드에서는 다음과 같이 사용합니다.

return Observable.of(res);

어떤 아이디어?


5
올바른 가져 오기 및 사용에서 import { of } from 'rxjs'; return of(res); rxjs6을 사용하는 경우 최신 문서를 확인하십시오. github.com/ReactiveX/rxjs/blob/master/MIGRATION.md#import-paths & github.com/ReactiveX/rxjs/blob/master/…
fidev

답변:


232

실제로 수입품이 엉망이되었습니다. 최신 버전의 RxJS에서는 다음과 같이 가져올 수 있습니다.

import 'rxjs/add/observable/of';

21
제 192 더블 테이크 후, 나는 내 코드에서 내가로부터 수입 된 것으로 나타났습니다 operator/- rxjs/add/operator/of대신 - observable/. 도
EricRobertBrewer

각도 프로젝트 중 하나 에서이 진술을 사용할 필요가 없다는 것을 알았습니다. 그러나 다른 하나에서는 가져와야합니다. 차이점을 이해하지 못합니다. 이유를 아십니까?
niaomingjian

1
아마도 앵귤러 버전?! 4.3.2에서는이 작업을 수행 할 필요가 없었지만 5.0.0에서는 수행했습니다.
Draghon

@Draghon : 나와 정확히 동일합니다. 나는 4.4를 위해 그것을 할 필요가 없었고, 나는 5.2를 위해 지금한다. 더 이상한 점은 하나의 파일에만 포함시키고 다른 모든 .ts 파일은 단순히 파일을 선택하여 이동하는 것입니다.
JP ten Berge

2
"rxjs / add / observable / of"모듈을 찾을 수 없으면 어떻게합니까?
Enrico


43

그것은 절대적으로 이상하게 들리지만 나와 함께 수입 경로에서 'O'를 대문자로 사용해야했습니다 import {Observable} from 'rxjs/Observable. observable_1.Observable.of is not a function에서 Observable을 가져 오면 오류 메시지가 표시됩니다 rxjs/observable. 이상하지만 다른 사람들에게 도움이되기를 바랍니다.


42

Angular 6/7을 사용하는 경우

import { of } from 'rxjs';

그리고 전화하는 대신

Observable.of(res);

그냥 사용

of(res);

이는 RxJS 버전이 5에서 6으로 변경되어 많은 주요 변경 사항이 도입 되었기 때문입니다. Angular 프로젝트를 마이그레이션하는 방법은 여기에서 확인할 수 있습니다. rxjs.dev/guide/v6/migration
Edric

29

어리석은 실수는 /add관찰 가능할 때 추가하는 것을 잊었다는 것입니다 .

였다:

import { Observable } from 'rxjs/Observable';
import 'rxjs/observable/of';

rxjs/observable/of실제로 파일 때문에 시각적으로 좋아 보이는 것은 존재합니다.

해야한다:

import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/of';

@Shaun_grady가 지적했듯이 어떻게 든 작동하지 않습니다. 나는 그의 제안과 함께 갔다
Sonne

20

어떤 이유로 든 패치가 작동하지 않았 으므로이 방법에 의지해야했습니다.

import { of } from 'rxjs/observable/of'

// ...

return of(res)

이것은 해결 방법이 아니며 Angular> = 6.0.0의 구문입니다. 'rxjs'에서 import {of}가 나에게 좋았습니다. 참조 stackoverflow.com/questions/38067580/...
mark_h

18

추가하기 만하면

당신이 그들을 많이 사용하는 경우 다음을 사용하여 모두 가져올 수 있습니다

import 'rxjs/Rx'; 

@Thierry Templier가 언급했듯이. 그러나 제한된 연산자를 사용하는 경우 다음과 같은 개별 연산자를 가져와야한다고 생각합니다.

import 'rxjs/add/operator/filter';
import 'rxjs/add/operator/mergeMap';
import 'rxjs/add/observable/of';

@uksz가 언급했듯이.

'rxjs / Rx'는 모든 Rx 구성 요소를 가져 오기 때문에 성능이 확실히 저하됩니다.

비교


1
각도 프로젝트 중 하나 에서이 진술을 사용할 필요가 없다는 것을 알았습니다. 그러나 다른 하나에서는 가져와야합니다. 차이점을 이해하지 못합니다. 이유를 아십니까?
niaomingjian

16

이 방법으로 모든 연산자를 가져올 수도 있습니다.

import {Observable} from 'rxjs/Rx';

7
이 방법은 가져 오기를 권장하지 않습니다.이 라이브러리는 상당히 큰 라이브러리이고 "of"는 그 중 아주 작은 부분입니다.
methgaard

2
@methgaard import { Observable } from 'rxjs/Observable' import 'rxjs/add/observable/of';가 작동하지 않습니다. 만 import {Observable} from 'rxjs/Rx';작동합니다. 버전은 5.4.2
niaomingjian

@methgaard 죄송합니다. 제가 실수를. 사실은 내가 얻었다 Observable_1.Observable.of(...).delay(...).timeout is not a function. 나는 사용하지 않았다import 'rxjs/add/operator/timeout'
niaomingjian

번들 크기도 증가합니다
Amirhossein Mehrvarzi

5

Angular 5.2 및 RxJS 5.5.6을 사용하고 있습니다.

이 코드는 작동 하지 않았습니다 .

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

     getHeroes(): Observable<Hero[]> {
        return of(Hero[]) HEROES;

      }

아래 코드는 작동했습니다.

    import { Observable } from 'rxjs/Observable';
    import { Subscriber } from 'rxjs/Subscriber';

     getHeroes(): Observable<Hero[]> 
     {
          return Observable.create((observer: Subscriber<any>) => {
              observer.next(HEROES);
              observer.complete();
          });

      }

전화 방법 :

this.heroService.getHeroes()
      .subscribe(heroes => this.heroes = heroes);

RxJS 5.5.2에서 () 기능이 이동 / 변경 될 수 있다고 생각합니다.


4

이것은 제대로 작동해야합니다.

import { Observable } from 'rxjs/Observable';
import 'rxjs/add/observable/of';

4
// "rxjs": "^5.5.10"
import { of } from 'rxjs/observable/of';

.... 
return of(res)

이것은 코드 전용 답변입니다. 제안하려는 내용을 설명해 주시겠습니까?
Peter Wippermann

1
안녕하세요. 성능 문제로 인해 전체 "관찰 가능"이 아니라 필요한 연산자 만 가져와야합니다. 새 버전 (^ 5.5.10)에서 "of"연산자를 가져 오는 올바른 방법은 다음과 같습니다. import {of} from 'rxjs / observable / of'... 내 경우에는 작동합니다. 해상도를 편집하겠습니다. 고마워 피터
letanthang

4

Angular 5 / Rxjs 5에서 Angular 6 / Rxjs 6으로 업그레이드 되었습니까?

가져 오기 및 인스턴스화를 변경해야합니다. Damien의 블로그 게시물을 확인하십시오.

Tl; dr :

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

const yourResult = Observable
    .create(of(yourObservable))
    .startWith(null)
    .map(x => x.someStringProperty.toLowerCase());

//subscribe to keyup event on input element
Observable
    .create(fromEvent(yourInputElement, 'keyup'))
    .debounceTime(5000)
    .distinctUntilChanged()
    .subscribe((event) => {
        yourEventHandler(event);
    });

1
6.0을 사용하여 Observable.create (of (val))에 가입하려고하면 "this._subscribe는 함수가 아닙니다"가됩니다. 대신 "of (val)"를 호출하여 관찰 가능 객체를 성공적으로 만들었습니다.
Jim Norman

3

RxJS 6

패키지를 RxJS사용하지 않고 라이브러리 버전 6으로 업그레이드하는 rxjs-compat경우 다음 코드

import 'rxjs/add/observable/of';   
  // ...
  return Observable.of(res);

로 변경해야합니다

import { of } from 'rxjs';
  // ...
  return of(res);

3

나를 위해 (Angular 5 & RxJS 5) 자동 완성 가져 오기 제안 :

import { Observable } from '../../../../../node_modules/rxjs/Observable';

(정적 연산자 from를 사용 of하면 정상적으로 작동합니다.

import { Observable } from 'rxjs/Observable';

2

오늘이 문제가있었습니다. systemjs를 사용하여 종속성을로드하고 있습니다.

나는 Rxjs를 다음과 같이로드했다 :

...
    paths: {
        "rxjs/*": "node_modules/rxjs/bundles/Rx.umd.min.js"
    },
...

사용 경로 대신 다음을 사용하십시오.

var map = {
...
'rxjs':                       'node_modules/rxjs',
...
}

var packages = {
...
'rxjs': { main: 'bundles/Rx.umd.min.js', defaultExtension: 'js' }
...
}

systemjs가 라이브러리를로드하는 방식에 약간의 변화가 내 문제를 해결했습니다.


이 질문은 Angular 2에 적용됩니다 . RxJS UMD 모듈에서는 제대로 수행되지 않습니다 .
Estus Flask

2

Angular 5+의 경우 :

import { Observable } from 'rxjs/Observable';작동해야합니다. 옵저버 패키지도 가져 오기와 일치해야합니다import { Observer } from 'rxjs/Observer';관찰자를 사용하는 경우

import {<something>} from 'rxjs'; 큰 수입을하기 때문에 피하는 것이 좋습니다.


1
import 'rxjs/add/observable/of';

rxjs-compat의 요구 사항을 보여줍니다.

require("rxjs-compat/add/observable/of");

나는 이것을 설치하지 않았다. 에 의해 설치

npm install rxjs-compat --save-dev

다시 실행하면 문제가 해결되었습니다.



0

어떻게 든 Webstorm조차도 이렇게 만들었고 import {of} from 'rxjs/observable/of'; 모든 것이 작동하기 시작했습니다.

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