Angular 6 RXJS Import Syntax?

谁都会走 提交于 2019-11-27 01:14:28

问题


I'm migrating an Angular 5 app to the latest CLI and Angular 6 RC and all of my Observable imports are broken. I see that Angular 6 changes the way the imports work, but I can't find any definite reference as to how the syntax works.

I had this in 5 and it worked fine:

import { Observable } from 'rxjs/Observable';
import 'rxjs/add/operator/map';
import 'rxjs/add/operator/catch';
import 'rxjs/add/observable/throw';

Now with the new syntax I see that

import { Observable, Subject, throwError} from 'rxjs';
import { map } from 'rxjs/operators';

The first two lines compile, but I can't figure out how to get catch and throw for example. .map() also throws a build error when used in code.

Anybody have a reference to how this is supposed to work?


回答1:


From rxjs 5.5, catch has been renamed to catchError function to avoid name clash.

Due to having operators available independent of an Observable, operator names cannot conflict with JavaScript keyword restrictions. Therefore the names of the pipeable version of some operators have changed.

import { catchError } from 'rxjs/operators';

For throw you can use ErrorObservable.

import { ErrorObservable } from 'rxjs/observable/ErrorObservable';
ErrorObservable.create(new Error("oops"));

rxjs 6

Instead of ErrorObservable use throwError.

 import { throwError } from 'rxjs'
 throwError(new Error("oops"));

Also you will now have to pipe the operators instead of directly chaining them to the observable




回答2:


Pipes are what is required for operator(s) going forward.

version: rxjs 6.0.1

Example:

import { Observable } from "rxjs";
import { map } from "rxjs/operators";

Observable.create((observer: any) => {
    observer.next('Hello')
}).pipe(map((val: any) => val.toUpperCase()))
  .subscribe((x: any) => addItem(x))


function addItem(val: any) {
    console.log('val', val);
}

//output - (In uppercase)
HELLO



回答3:


Or if you want to keep using version 6.0.0 you do

npm i --save rxjs-compat

to add reverse compatibility




回答4:


Run these 2 commands after running ng update. This should fix the rxjs imports:

  1. npm i -g rxjs-tslint
  2. rxjs-5-to-6-migrate -p src/tsconfig.app.json

References:

  • https://github.com/ReactiveX/rxjs-tslint



回答5:


You just need to import like operators

import { Observable } from 'rxjs';
import { map, catchError, timeout } from 'rxjs/operators';


来源:https://stackoverflow.com/questions/49811177/angular-6-rxjs-import-syntax

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!