使用 RxJS 出现 "is not a function " 个错误
Getting "is not a function " errors with RxJS
似乎出乎意料,我在使用 RxJS 时遇到错误。
我的项目是 Angular,Typescript,我使用 RxJS 作为 NGRX redux 的一部分。
我的代码 似乎 仅作为导入就可以正常工作:
import { Observable } from 'rxjs/Observable'
然后,我不知从哪里开始收到这样的错误...
Uncaught (in promise): TypeError: this.appStateStore.withLatestFrom is not a function
Uncaught (in promise): TypeError: this.appStateStore.take is not a function
我能够通过添加 import 'rxjs/add/operator/withLatestFrom';
的导入解决有关 withLatestFrom
的错误,但随后错误转移到抱怨 .take
。
我猜我在某处导入错误,据我所知,对于 RxJS,您需要导入所需的位。但是,我已经检查了我的源代码控制更改,但我看不到任何会导致这种情况刚刚开始发生的更改(例如节点模块版本、导入语句)。
我做错了什么?
import 'rxjs/add/operator/distinctUntilChanged';
import 'rxjs/add/operator/take;
Rxjs v 5.4.1
1) import { Rx } from 'rxjs/Rx
;
这将导入整个库。那么你就不用担心加载每个 operator 了。但是你需要附加 Rx。 希望tree-shaking能够优化并只挑选需要的功能(需要验证)正如评论中提到的,tree-shaking无济于事。所以这不是优化的方式。
public cache = new Rx.BehaviorSubject('');
或者您可以导入个别 运算符。
这将优化您的应用以仅使用这些文件:
2) import { _______ } from 'rxjs/_________';
此语法通常用于主要对象,如 Rx
本身或 Observable
等,
可以使用此语法导入的关键字
Observable, Observer, BehaviorSubject, Subject, ReplaySubject
3) import 'rxjs/add/observable/__________';
这些通常直接与 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/_________';
这些通常在 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
是 mergeMap
的别名,因此我们需要导入 mergeMap
才能使用 flatMap
。
/add
进口注意事项:
整个项目只需要导入一次。所以建议在一个地方做。如果它们包含在多个文件中,并且其中一个被删除,构建将因错误原因而失败。
似乎出乎意料,我在使用 RxJS 时遇到错误。
我的项目是 Angular,Typescript,我使用 RxJS 作为 NGRX redux 的一部分。
我的代码 似乎 仅作为导入就可以正常工作:
import { Observable } from 'rxjs/Observable'
然后,我不知从哪里开始收到这样的错误...
Uncaught (in promise): TypeError: this.appStateStore.withLatestFrom is not a function
Uncaught (in promise): TypeError: this.appStateStore.take is not a function
我能够通过添加 import 'rxjs/add/operator/withLatestFrom';
的导入解决有关 withLatestFrom
的错误,但随后错误转移到抱怨 .take
。
我猜我在某处导入错误,据我所知,对于 RxJS,您需要导入所需的位。但是,我已经检查了我的源代码控制更改,但我看不到任何会导致这种情况刚刚开始发生的更改(例如节点模块版本、导入语句)。
我做错了什么?
import 'rxjs/add/operator/distinctUntilChanged';
import 'rxjs/add/operator/take;
Rxjs v 5.4.1
1) import { Rx } from 'rxjs/Rx
;
这将导入整个库。那么你就不用担心加载每个 operator 了。但是你需要附加 Rx。 希望tree-shaking能够优化并只挑选需要的功能(需要验证)正如评论中提到的,tree-shaking无济于事。所以这不是优化的方式。
public cache = new Rx.BehaviorSubject('');
或者您可以导入个别 运算符。
这将优化您的应用以仅使用这些文件:
2) import { _______ } from 'rxjs/_________';
此语法通常用于主要对象,如 Rx
本身或 Observable
等,
可以使用此语法导入的关键字
Observable, Observer, BehaviorSubject, Subject, ReplaySubject
3) import 'rxjs/add/observable/__________';
这些通常直接与 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/_________';
这些通常在 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
是 mergeMap
的别名,因此我们需要导入 mergeMap
才能使用 flatMap
。
/add
进口注意事项:
整个项目只需要导入一次。所以建议在一个地方做。如果它们包含在多个文件中,并且其中一个被删除,构建将因错误原因而失败。