angular - Får "är inte en funktion"-fel med RxJS


Till synes helt plötsligt får jag fel med RxJS.

Mitt projekt är Angular, Typescript och jag använder RxJS som en del av NGRX redux.

Min kod verkar fungera helt bra med bara detta som en import:

import { Observable } from 'rxjs/Observable'

Sedan, från ingenstans började jag få fel som detta...

Okänt fel (i löfte): TypeError: this.appStateStore.withLatestFrom är inte en funktion Okänt fel (i löfte): TypeError: this.appStateStore.take är inte en funktion

Jag kunde lösa felet med withLatestFrom genom att lägga till en import av import 'rxjs/add/operator/withLatestFrom'; men sedan flyttades felet till att klaga på .take.

Jag gissar att jag har en felaktig import någonstans eftersom jag förstår att med RxJS behöver man importera de delar man behöver. Men jag har granskat mina ändringar i versionskontrollen och jag kan inte se några ändringar (t.ex. node-modulversion, importuttalanden) som skulle göra att detta plötsligt börjar hända.

Vad gör jag fel?

Svar #1

import 'rxjs/add/operator/distinctUntilChanged'; 
import 'rxjs/add/operator/take;

Rxjs v 5.4.1

1) importera { Rx } från 'rxjs/Rx';

Detta importerar hela biblioteket. Då behöver du inte oroa dig för att ladda varje operator. Men du behöver lägga till Rx. Som nämnts i kommentarerna, kan inte tree-shaking hjälpa. Så detta är inte ett optimerat sätt.

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

Eller så kan du importera enskilda operatörer.

Detta kommer att optimera din app för att endast använda dessa filer :

2) importera { _______ } från 'rxjs/_________';

Denna syntax används vanligtvis för huvudsakliga objekt som Rx själv eller Observable etc.

Nyckelord som kan importeras med denna syntax

 Observable, Observer, BehaviorSubject, Subject, ReplaySubject

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

Dessa åtföljs vanligtvis direkt av Observable. Till exempel

Observable.from()
Observable.of()

Andra sådana nyckelord som kan importeras med denna syntax:

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

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

Dessa kommer vanligtvis i strömmen efter att Observable har skapats. Som flatMap i detta kodexempel:

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

Andra sådana nyckelord som använder denna syntax:

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 är en alias för mergeMap så vi behöver importera mergeMap för att använda flatMap.

Notera för /add import :

Vi behöver bara importera en gång i hela projektet. Så det rekommenderas att göra det på ett enda ställe. Om de inkluderas i flera filer, och en av dem tas bort, kommer byggandet att misslyckas av fel skäl.

Relaterade artiklar