En mi aplicación angular 2 tengo un servicio que usa la Observable
clase de la rxjs
biblioteca.
import { Observable } from 'rxjs';
Por el momento solo estoy usando Observable
para poder usar la toPromise()
función.
Leí en otra pregunta de StackOverflow en alguna parte que importar de esta manera y también importar desde rxjs/Rx
importará una gran cantidad de cosas innecesarias de la rxjs
biblioteca que aumentarán los tiempos de carga de la página y / o la base del código.
Mi pregunta es, ¿cuál es la mejor manera de importar Observable
para poder usar la toPromise()
función sin tener que importar todo lo demás?
angular
typescript
rxjs
angular2-observables
Danoram
fuente
fuente
import {Observable} from 'rxjs/Observable';
importaría el Observable, pero no necesita importarlo todo si está usando promesas ...toPromise
funciona sin él.toPromise
? Estoy usando Observable, debería haberlo aclarado en la pregunta. en realidad son dos preguntas separadas.import 'rxjs/add/operator/toPromise';
Echa un vistazo a angular.io/docs/ts/latest/tutorial/toh-pt6.html Eso debería ayudarte :)Respuestas:
Rxjs v 6. *
Se simplificó con la versión más nueva de rxjs.
1) Operadores
import {map} from 'rxjs/operators';
2) Otros
import {Observable,of, from } from 'rxjs';
En lugar de encadenar, necesitamos canalizar. Por ejemplo
Sintaxis antigua:
Nueva sintaxis:
Nota: ¡ Algunos operadores tienen un cambio de nombre debido a colisiones de nombres con palabras reservadas de JavaScript! Éstas incluyen:
do
->tap
,catch
->catchError
switch
->switchAll
finally
->finalize
Rxjs v 5. *
Estoy escribiendo esta respuesta en parte para ayudarme a mí mismo, ya que sigo revisando los documentos cada vez que necesito importar un operador. Avísame si se puede hacer algo mejor.
1)
import { Rx } from 'rxjs/Rx'
;Esto importa toda la biblioteca. Entonces no necesita preocuparse por cargar cada operador. Pero debe agregar Rx.
Espero que la agitación de árboles optimice y elija solo las funciones necesarias (es necesario verificar)Como se mencionó en los comentarios, la agitación de árboles no puede ayudar. Entonces esta no es una forma optimizada.public cache = new Rx.BehaviorSubject('');
O puede importar operadores individuales .
Esto optimizará su aplicación para usar solo esos archivos :
2)
import { _______ } from 'rxjs/_________';
Esta sintaxis generalmente se usa para el objeto principal como él
Rx
mismo oObservable
etc.,Palabras clave que se pueden importar con esta sintaxis
3)
import 'rxjs/add/observable/__________';
Actualización para Angular 5
Con Angular 5, que usa rxjs 5.5.2+
import { empty } from 'rxjs/observable/empty'; import { concat} from 'rxjs/observable/concat';
Suelen ir acompañados de Observable directamente. Por ejemplo
Otras palabras clave que se pueden importar con esta sintaxis:
concat, defer, empty, forkJoin, from, fromPromise, if, interval, merge, of, range, throw, timer, using, zip
4)
import 'rxjs/add/operator/_________';
Actualización para Angular 5
Con Angular 5, que usa rxjs 5.5.2+
import { filter } from 'rxjs/operators/filter'; import { map } from 'rxjs/operators/map';
Por lo general, estos vienen en la secuencia después de que se crea el Observable. Como
flatMap
en este fragmento de código:Observable.of([1,2,3,4]) .flatMap(arr => Observable.from(arr));
Otras palabras clave que utilizan esta sintaxis:
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
es el alias de, pormergeMap
lo que debemos importarmergeMap
para usarloflatMap
.Nota para las
/add
importaciones :Solo necesitamos importar una vez en todo el proyecto. Por eso se aconseja hacerlo en un solo lugar. Si se incluyen en varios archivos y uno de ellos se elimina, la compilación fallará por motivos incorrectos.
fuente
/add/operator
y/operators
las Funciona de maravilla.Actualización para RxJS 6 (abril de 2018)
Ahora está perfectamente bien importar directamente desde
rxjs
. (Como se puede ver en Angular 6+). Importar desderxjs/operators
también está bien y, en realidad, ya no es posible importar operadores a nivel mundial (una de las principales razones para la refactorizaciónrxjs 6
y el uso del nuevo enfoquepipe
). Gracias a este treehaking ahora también se puede utilizar.Código de muestra del repositorio de 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));
¿Compatibilidad con versiones anteriores para rxjs <6?
El equipo de rxjs lanzó un paquete de compatibilidad en npm que es prácticamente instalar y jugar. Con esto, todo su
rxjs 5.x
código debería ejecutarse sin problemas. Esto es especialmente útil ahora cuando la mayoría de las dependencias (es decir, módulos para Angular) aún no están actualizadas.fuente
pipe
lugar de encadenar métodos juntospipe
gofore.com/en/lettable-operators-and-rxjs-versioning (no se trata específicamente de la versión 6, pero me ayudó a comprender por qué tantos cambios drásticos en RxJS6 que no están bien explicados en su propia guía)Una cosa que he aprendido por las malas es ser consistente
Cuidado con la mezcla:
import { BehaviorSubject } from "rxjs";
con
import { BehaviorSubject } from "rxjs/BehaviorSubject";
Esto probablemente funcionará bien HASTA que intente pasar el objeto a otra clase (donde lo hizo al revés) y luego esto puede fallar
(myBehaviorSubject instanceof Observable)
Falla porque la cadena del prototipo será diferente y será falsa.
No puedo fingir entender exactamente lo que está sucediendo, pero a veces me encuentro con esto y necesito cambiar al formato más largo.
fuente
"rxjs"
y fusionará con gusto las definiciones donde parece que es mejor hacerlo por separado en el formato 'largo'.