Javascript 为什么需要在RxJs中导入运算符?
在学习角度教程时,我发现:Javascript 为什么需要在RxJs中导入运算符?,javascript,typescript,rxjs,Javascript,Typescript,Rxjs,在学习角度教程时,我发现: import 'rxjs/add/operator/switchMap'; export class HeroDetailComponent implements OnInit { ngOnInit(): void { this.route.paramMap .switchMap((params: ParamMap) => this.heroService.getHero(+params.get('id'))) .subsc
import 'rxjs/add/operator/switchMap';
export class HeroDetailComponent implements OnInit {
ngOnInit(): void {
this.route.paramMap
.switchMap((params: ParamMap) => this.heroService.getHero(+params.get('id')))
.subscribe(hero => this.hero = hero);
}
}
很抱歉,如果我觉得这有点奇怪(原因有二:我来自Java,并没有真正了解最新的JS技术)。switchMap
不是属于param-map
的方法吗,它是可观察的
?当我删除import语句时,代码不会编译
我使用RxJava,但是操作可观察对象所需的所有方法都已经存在(附加)了可观察对象类本身
有人能告诉我为什么需要导入
switchMap
?可能的话,给我一些参考链接。你可以阅读这篇文章:
至少有很多操作员失踪。但这不是错误,这是故意的。Angular不会提供所有可用的操作符。这将导致额外的300 kb。因此,要获得具有更多运算符的可观测值,可以导入所需的运算符,也可以导入所有运算符
在构建web应用程序时,应使用较少的http请求,
为了获得更好的性能,您应该压缩文件大小。您可以阅读本文: 至少有很多操作员失踪。但这不是错误,这是故意的。Angular不会提供所有可用的操作符。这将导致额外的300 kb。因此,要获得具有更多运算符的可观测值,可以导入所需的运算符,也可以导入所有运算符 在构建web应用程序时,应使用较少的http请求,
为了获得更好的性能,您应该压缩文件大小。如果深入查看
节点模块
文件夹中的源文件,可能会帮助您理解。当您导入switchMap
时,您的类型脚本加载switchMap.d.ts
,但编译的javascript加载switchMap.js
switchMap.d.ts
有一个可观察接口的声明,但是当您定义一个与现有接口同名的接口时,typescript将合并这两个接口定义。因此,在编译时导入所做的一切就是使用可观察的使新的开关映射方法对任何对象都可访问:
import { switchMap } from '../../operator/switchMap';
declare module '../../Observable' {
interface Observable<T> {
switchMap: typeof switchMap;
}
}
当然,您不必直接导入switchMap
来显示它,如果程序中有任何代码导入它,那么switchMap
方法将在运行时存在,但是,如果您没有导入类型脚本,它将试图阻止您使用它。如果您深入查看节点模块
文件夹中的源文件,它可能会帮助您理解。当您导入switchMap
时,您的类型脚本加载switchMap.d.ts
,但编译的javascript加载switchMap.js
switchMap.d.ts
有一个可观察接口的声明
,但是当您定义一个与现有接口同名的接口时,typescript将合并这两个接口定义。因此,在编译时导入所做的一切就是使用可观察的使新的开关映射方法对任何对象都可访问:
import { switchMap } from '../../operator/switchMap';
declare module '../../Observable' {
interface Observable<T> {
switchMap: typeof switchMap;
}
}
当然,您不必直接导入switchMap
,如果程序中有任何代码导入它,那么switchMap
方法将在运行时存在,但是如果您没有import
typescript,则会试图阻止您使用它。因为RxJs是功能性的,我不明白为什么paramMap
会“拥有”switchMap
。检查他们文档中的示例用法。我在面向对象编程中的理解是,如果一个对象后面跟点(.),那么就用curl表示,例如rectangle.calcrea()
,然后,应该将calcArea
函数定义为矩形中的一个函数/方法。因为加载所有rxjs库非常大(这将是低效的,页面的呈现速度会很慢)。因此,最好只导入您需要的内容,在您的示例中,您需要switchMap,所以您只需要导入switchMap函数(不是rxjs的所有函数)。在Java中,您不需要关心它,整个库都被导入到您的项目中。@sancho21是的,但是如果没有导入,该方法就不存在。导入添加了该方法。由于RxJs是功能性的,我不明白为什么paramMap
会“拥有”switchMap
。检查他们文档中的示例用法。我在面向对象编程中理解的是,如果一个对象后跟点(.),那么就用curl表示,例如rectangle.calcrea()
,然后,应该将calcArea
函数定义为矩形中的一个函数/方法。因为加载所有rxjs库非常大(这将是低效的,页面的呈现速度会很慢)。因此,最好只导入您需要的内容,在您的示例中,您需要switchMap,所以您只需要导入switchMap函数(不是rxjs的所有函数)。在Java中,您不需要关心它,整个库都被导入到您的项目中。@sancho21是的,但是如果没有导入,该方法就不存在。导入将添加该方法。