rxjs에서 Observable을 가져 오는 가장 좋은 방법


79

내 각도 2 앱 Observable에는 rxjs라이브러리 의 클래스 를 사용하는 서비스가 있습니다.

import { Observable } from 'rxjs';

지금 ObservabletoPromise()기능을 사용할 수 있도록 사용하고 있습니다.

나는 어딘가에서 다른 StackOverflow 질문을 읽었습니다.이 방법으로 가져오고 또한 가져 오면 라이브러리 rxjs/Rx에서 불필요한 항목을 많이 가져와 rxjs페이지로드 시간 및 / 또는 코드 기반을 증가시킵니다.

내 질문은 다른 모든 것을 가져 오지 않고도 함수를 Observable사용할 수 있도록 가져 오는 가장 좋은 방법은 무엇 toPromise()입니까?


2
import {Observable} from 'rxjs/Observable';Observable을 가져올 수 있지만 promise를 사용하는 경우 모두 가져올 필요는 없습니다 toPromise.
AJT82

그냥 사용하려면 무엇을 가져와야 toPromise합니까? 나는 Observable을 사용하고 있는데, 나는 질문에서 그것을 명확히해야했다. 정말 두 가지 질문입니다.
Danoram

2
약속을 원한다면 angular.io/docs/ts/latest/tutorial/toh-pt6.html을import 'rxjs/add/operator/toPromise'; 살펴보십시오. 도움이 될 것입니다. :)
AJT82

조사하겠습니다. 시간을내어 공유해 주셔서 감사합니다!
Danoram

문제 없어요! 즐거운 코딩 되세요! :)
AJT82

답변:


138

Rxjs v 6. *

새로운 버전의 rxjs로 단순화되었습니다.

1) 연산자

import {map} from 'rxjs/operators';

2) 기타

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

연결하는 대신. 예를 들면

이전 구문 :

source.map().switchMap().subscribe()

새로운 구문 :

source.pipe(map(), switchMap()).subscribe()

참고 : 일부 연산자는 JavaScript 예약어와 이름 충돌로 인해 이름이 변경되었습니다! 여기에는 다음이 포함됩니다.

do -> tap ,

catch -> catchError

switch -> switchAll

finally -> finalize


Rxjs v 5. *

연산자를 가져와야 할 때마다 문서를 계속 확인하기 때문에이 답변을 부분적으로 작성하고 있습니다. 더 나은 방법으로 할 수있는 일이 있으면 알려주세요.

1) import { Rx } from 'rxjs/Rx';

전체 라이브러리를 가져옵니다. 그러면 각 연산자를로드하는 것에 대해 걱정할 필요가 없습니다. 그러나 Rx를 추가해야합니다. 나는 트리 쉐이킹이 최적화되고 필요한 기능만을 선택하기를 바랍니다 (확인 필요) 코멘트에서 언급했듯이 트리 쉐이킹은 도움이되지 않습니다. 따라서 이것은 최적화 된 방법이 아닙니다.

public cache = new Rx.BehaviorSubject('');

또는 개별 연산자를 가져올 수 있습니다 .

이렇게하면 해당 파일 만 사용하도록 앱이 최적화됩니다. .

2) import { _______ } from 'rxjs/_________';

이 구문은 일반적으로 Rx자체 또는Observable 등의 .

이 구문으로 가져올 수있는 키워드

 Observable, Observer, BehaviorSubject, Subject, ReplaySubject

삼) import 'rxjs/add/observable/__________';

Angular 5 업데이트

rxjs 5.5.2+를 사용하는 Angular 5

import { empty } from 'rxjs/observable/empty';
import { concat} from 'rxjs/observable/concat';

이들은 일반적으로 Observable과 직접 함께 제공됩니다. 예를 들면

Observable.from()
Observable.of()

이 구문을 사용하여 가져올 수있는 다른 키워드 :

concat, defer, empty, forkJoin, from, fromPromise, if, interval, merge, of, 
range, throw, timer, using, zip

4) import 'rxjs/add/operator/_________';

Angular 5 업데이트

rxjs 5.5.2+를 사용하는 Angular 5

import { filter } from 'rxjs/operators/filter';
import { map } from 'rxjs/operators/map';

이들은 일반적으로 Observable이 생성 된 후 스트림에 들어옵니다. flatMap이 코드 조각 과 같이 :

Observable.of([1,2,3,4])
          .flatMap(arr => Observable.from(arr));

이 구문을 사용하는 다른 키워드 :

audit, buffer, catch, combineAll, combineLatest, concat, count, debounce, delay, 
distinct, do, every, expand, filter, finally, find , first, groupBy,
ignoreElements, isEmpty, last, let, map, max, merge, mergeMap, min, pluck, 
publish, race, reduce, repeat, scan, skip, startWith, switch, switchMap, take, 
takeUntil, throttle, timeout, toArray, toPromise, withLatestFrom, zip

FlatMap : flatMap에 별칭 이므로을 사용 mergeMap하려면 가져와야 mergeMap합니다 flatMap.


/add수입에 대한 참고 사항 :

전체 프로젝트에서 한 번만 가져 오면됩니다. 따라서 한 곳에서 수행하는 것이 좋습니다. 여러 파일에 포함되어 있고 그중 하나가 삭제되면 잘못된 이유로 빌드가 실패합니다.


3
트리 쉐이킹은 내보내기 및 가져 오기 정의의 기호 이름에 의존하기 때문에 여기서 최적화 할 수 없으며 RxJS 연산자 모듈은 아무것도 내 보내지 않고 대신 전역 상태를 변경합니다. 참조
스미스 씨에게

import {map} from 'rxjs / operators / map};과 같이 연산자를 하나씩 가져와야한다고 생각합니다. import {filter} from 'rxjs / operators / filter}
Michael Burger

groupBy는 Angular 5+에서 나를 위해 작동하지 않았지만 다른 사람들은 그래도 작동했습니다.
Joe

좋은 대답입니다. 수입품 /add/operator과 의 차이점을 몰랐습니다 /operators. 매력처럼 작동합니다.
Stephen Chung

1
멋지지만 문서에서 어디에 있습니까? Rxjs 문서를 사용하기 어렵다는 것을 알았습니다.
Robert Kusznier

22

RxJS 6 업데이트 (2018 년 4 월)

이제에서 직접 가져올 수 있습니다 rxjs. (Angular 6+에서 볼 수 있듯이). 에서 가져 오기도 rxjs/operators괜찮으며 실제로 더 이상 연산자를 전역으로 가져올 수 없습니다 (리팩토링의 주요 이유 중 하나이며를 rxjs 6사용하는 새로운 접근 방식 pipe). 이 트리 셰이 킹 덕분에 이제도 사용할 수 있습니다.

rxjs repo의 샘플 코드 :

import { Observable, Subject, ReplaySubject, from, of, range } from 'rxjs';
import { map, filter, switchMap } from 'rxjs/operators';

range(1, 200)
  .pipe(filter(x => x % 2 === 1), map(x => x + x))
  .subscribe(x => console.log(x));

rxjs <6에 대한 하위 호환성?

rxjs 팀 은 npm에서 설치 및 플레이가 가능한 호환성 패키지 를 출시했습니다 . 이것으로 모든 rxjs 5.x코드는 문제없이 실행되어야합니다. 이것은 대부분의 종속성 (예 : Angular 용 모듈)이 아직 업데이트되지 않은 경우 특히 유용합니다.


Angular 6.0.0-rc.5에서 문제가 발생했습니다. 그리고 변경 한 사람이 RxJS라는 것을 몰랐습니다. 나는 또한 파이프에서 필터를 제거했습니다.
M. Sundstrom

RxJS6에는 많은 변화가 있습니다. 이 github.com/ReactiveX/rxjs/blob/master/MIGRATION.md 및 / 또는 auth0.com/blog/whats-new-in-rxjs-6 을 읽는 데 시간을 할애하여 RxJs7 을 준비 할 수 있습니다. 정말 사라집니다. @enn이 언급했듯이 이제는 pipe메서드를 함께 연결 하는 대신 사용해야합니다
Simon_Weaver

이 기사는 pipe gofore.com/en/lettable-operators-and-rxjs-versioning 의 이점을 설명하는 데 유용합니다 (특정 버전 6에 관한 것은 아니지만 RxJS6에서 잘 설명되지 않은 많은 급격한 변경 사항을 이해하는 데 도움이되었습니다. 자신의 가이드)
Simon_Weaver

3

제가 어렵게 배운 한 가지는 일관성을 유지하는 것입니다.

믹싱주의 :

 import { BehaviorSubject } from "rxjs";

 import { BehaviorSubject } from "rxjs/BehaviorSubject";

객체를 다른 클래스로 전달하려고 할 때까지 (다른 방법으로 수행 한 경우) 실패 할 때까지 제대로 작동 할 것입니다.

 (myBehaviorSubject instanceof Observable)

프로토 타입 체인이 다르고 거짓이기 때문에 실패합니다.

나는 무슨 일이 일어나고 있는지 정확히 이해하는 척 할 수 없지만 때로는 이것에 부딪쳐 더 긴 형식으로 변경해야합니다.


사람이 더 나은 설명 기쁘게 할 수 있다면 :-) 회신 해 주시기 바랍니다
Simon_Weaver

예를 들어 Visual Studio "rxjs"는 '긴'형식으로 개별적으로 수행하는 것이 더 낫다고 생각되는 정의를 기꺼이 가져오고 병합합니다.
Simon_Weaver
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.