即使我在 angular2 中使用带有 Observables 的 map 来为 get post 进行服务调用,而我的 service.ts 过去看起来像这样,而且它工作得非常好(之前)。我只会导入
从“rxjs”导入{Observable};
对于angular2来说已经足够了
public init() : Observable<UserData> {
return this.http.get(this.baseUrl + "/init", this.options)
.map(SharedService.extractJson)
.catch(SharedService.handleError);
}
components.ts 看起来像这样
init() {
this.service.init().subscribe((info) => {
this.metaUser = info;
}, (error) => {
console.log(SharedService.getError(error._body));
});
但最近我尝试使用相同的语法并收到上述错误。从 2/4 到最新的 Angular 有一些显着的变化,一些方法已被弃用,名称也有一些变化。所以工作代码(service.ts)看起来像这样(这些是工作代码的点点滴滴以及相应的导入语句)
import {HttpClient} from "@angular/common/http";
import {Observable, of} from "rxjs";
import {catchError, map, tap} from 'rxjs/operators';
getConfig(): Observable<any> {
return this.http.get(this.getDataUrl)
.pipe(
tap(_ => console.log('fetched data')),
catchError(this.handleError('getData', []))
);}
private handleError<T>(operation = 'operation', result?: T) {
return (error: any): Observable<T> => {
console.error(error); // log to console instead
// TODO: better job of transforming error for user consumption
console.log(`${operation} failed: ${error.message}`);
// Let the app keep running by returning an empty result.
return of(result as T);
};}
组件看起来像这样
getData(){
this.serviceData.getConfig().subscribe((info:any)=>{
console.log(info);
},(err:any)=>{
console.log(err);
});
}
那些好奇'tap'做什么的人,这里是写在角度页面上的解释
HeroService 方法将利用可观察值流
并发送一条消息(通过 log())到底部的消息区域
页面。
他们会使用 RxJS 的 tap 操作符来做这件事,它查看
可观察的值,对这些值做一些事情,并传递它们
沿着。点击回调不会触及值本身。