使用 RxJS 时出现“不是函数”错误

问题描述 投票:0回答:2

我突然遇到了 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

我能够通过添加

withLatestFrom
的导入来解决有关
import 'rxjs/add/operator/withLatestFrom';
的错误,但随后错误转向抱怨
.take

我猜我在某个地方导入错误,据我所知,使用 RxJS 你需要导入你需要的位。然而,我已经检查了我的源代码控制更改,并且看不到任何会导致这种情况开始发生的更改(例如节点模块版本、导入语句)。

我做错了什么?

angular typescript rxjs ngrx angular2-observables
2个回答
21
投票
import 'rxjs/add/operator/distinctUntilChanged'; 
import 'rxjs/add/operator/take;

Rxjs v 5.4.1

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

这将导入整个库。那么你就不需要担心加载每个操作符了。但你需要附加 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
进口注意事项

整个项目我们只需要导入一次。因此建议在一个地方进行。如果它们包含在多个文件中,并且其中一个被删除,则构建将因错误原因失败。


0
投票

如果有人使用

mergeMap, concatMap, exhaustMap or switchMap
来到这里,就像我一样,你可能错过了添加箭头功能部分

()=>

这会起作用:

mergeMap(() => this.loginForm.valueChanges.pipe()),

这个会给你一个错误:)

错误类型错误:项目不是函数

mergeMap(this.loginForm.valueChanges.pipe()),
© www.soinside.com 2019 - 2024. All rights reserved.