Angular 从rxjs导入Observable的最佳方法

Angular 从rxjs导入Observable的最佳方法,angular,typescript,rxjs,angular2-observables,Angular,Typescript,Rxjs,Angular2 Observables,在angular 2应用程序中,我有一个使用rxjs库中的Observable类的服务 import { Observable } from 'rxjs'; 目前我正在使用Observable,以便使用toPromise()函数 我在某个地方读到另一个StackOverflow问题,以这种方式导入以及从rxjs/Rx导入将从rxjs库导入大量不必要的内容,这将增加页面加载时间和/或代码库 我的问题是,导入Observable的最佳方法是什么,这样我就可以使用toPromise()函数而不必导入

在angular 2应用程序中,我有一个使用
rxjs
库中的
Observable
类的服务

import { Observable } from 'rxjs';
目前我正在使用
Observable
,以便使用
toPromise()
函数

我在某个地方读到另一个StackOverflow问题,以这种方式导入以及从
rxjs/Rx
导入将从
rxjs
库导入大量不必要的内容,这将增加页面加载时间和/或代码库

我的问题是,导入
Observable
的最佳方法是什么,这样我就可以使用
toPromise()
函数而不必导入其他所有内容?

Rxjs v 6* 新版本的rxjs简化了它

1) 操作员 2) 其他 我们需要的不是链子,而是管道。比如说

旧语法:

source.map().switchMap().subscribe()
新语法:

source.pipe(map(), switchMap()).subscribe()
注意:由于与JavaScript保留字的名称冲突,某些运算符的名称发生了更改!这些措施包括:

do
->
轻触

catch
->
catchError

switch
->
switchAll

最终
->
最终


rxjsv5* 我写这个答案部分是为了帮助自己,因为每次需要导入操作员时,我都会检查文档。让我知道,如果有什么事情可以做得更好的方式

1)
从'rxjs/Rx'导入{Rx}
; 这将导入整个库。这样,您就不必担心加载每个操作符了。但是您需要附加Rx。我希望树摇动将优化和挑选只需要的功能(需要验证),如评论中所述,树摇动不能帮助。所以这不是优化的方法

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

或者,您可以导入单个运算符

这将优化您的应用程序,使其仅使用这些文件

2)
import{{uuuuuuuuuuuuuuuj}来自'rxjs/uuuuuuuuuuuuuj'
此语法通常用于主要对象,如
Rx
本身或
可观察的

可以使用此语法导入的关键字

 Observable, Observer, BehaviorSubject, Subject, ReplaySubject
3)
import'rxjs/add/observable/_________________
角度5的更新

使用Angular 5,使用rxjs 5.5.2+

import { empty } from 'rxjs/observable/empty';
import { concat} from 'rxjs/observable/concat';
import { filter } from 'rxjs/operators/filter';
import { map } from 'rxjs/operators/map';
这些通常伴随着可直接观察到的。比如说

Observable.from()
Observable.of()
可以使用此语法导入的其他此类关键字:

concat, defer, empty, forkJoin, from, fromPromise, if, interval, merge, of, 
range, throw, timer, using, zip
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
4)
import'rxjs/add/operator/________________
角度5的更新

使用Angular 5,使用rxjs 5.5.2+

import { empty } from 'rxjs/observable/empty';
import { concat} from 'rxjs/observable/concat';
import { filter } from 'rxjs/operators/filter';
import { map } from 'rxjs/operators/map';
这些通常在可观察对象创建之后出现在流中。与此代码段中的
flatMap
类似:

Observable.of([1,2,3,4])
          .flatMap(arr => Observable.from(arr));
使用此语法的其他此类关键字:

concat, defer, empty, forkJoin, from, fromPromise, if, interval, merge, of, 
range, throw, timer, using, zip
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
注意事项


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

经过艰苦的学习,我学到了一件事,那就是始终如一

注意混合:

 import { BehaviorSubject } from "rxjs";

在您尝试将对象传递给另一个类(您以另一种方式传递对象)之前,这可能会很好地工作,然后这可能会失败

 (myBehaviorSubject instanceof Observable)
它失败了,因为原型链将是不同的,它将是错误的

我不能假装完全理解正在发生的事情,但有时我会遇到这种情况,需要更改为更长的格式。

RxJS 6的更新(2018年4月)

现在可以直接从
rxjs
导入。(如图6+所示。从
rxjs/operators
导入操作也很好,实际上不可能再全局导入操作(重构
rxjs 6
和使用
管道的新方法的主要原因之一)。多亏了这一点,现在也可以使用爬树了

rxjs回购协议的示例代码:

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的模块)尚未更新时,这尤其有用

从'rxjs/Observable'导入{Observable}
将导入可观察对象,但如果使用承诺,则不需要全部导入
toPromise
在没有它的情况下工作。我需要自己导入什么才能使用
toPromise
?我使用的是Observable,我应该在问题中澄清这一点。这实际上是两个独立的问题。如果您想要导入'rxjs/add/operator/toPromise'看一看应该对你有帮助的:)我会调查的。干杯,感谢您抽出时间与我们分享!没问题!快乐编码!:)树抖动在这里无法优化,因为它依赖于导出和导入定义的符号名,RxJS操作符模块不导出任何内容,而是更改全局状态。我认为您必须一个接一个地导入任何操作符,就像从'rxjs/operators/map}导入{map};从'rxjs/operators/filter}groupBy导入{filter}在Angular 5+上对我不起作用,但其他人起作用。回答很好。我不知道
/add/operator
/operators
导入之间的区别。很有魅力。很酷,但文档中的内容在哪里?我发现Rxjs文档很难使用。如果有人能更好地解释这一点,请回答:-)例如,Visual Studio将很高兴地从
“Rxjs”
导入,并将定义合并在一起,似乎您最好以“长”格式单独进行。我在Angular 6.0.0-rc.5中遇到了问题。我不知道它是w