我目前正在尝试自学Angular2和TypeScript,之前4年一直愉快地使用AngularJS 1.*!我不得不承认我讨厌它,但我相信我的顿悟时刻即将到来...无论如何,我在我的虚拟应用程序中编写了一个服务,可以从我编写的虚拟后端获取HTTP数据,该后端提供JSON。
import {Injectable} from 'angular2/core';
import {Http, Headers, Response} from 'angular2/http';
import {Observable} from 'rxjs';
@Injectable()
export class UserData {
constructor(public http: Http) {
}
getUserStatus(): any {
var headers = new Headers();
headers.append('Content-Type', 'application/json');
return this.http.get('/restservice/userstatus', {headers: headers})
.map((data: any) => data.json())
.catch(this.handleError);
}
getUserInfo(): any {
var headers = new Headers();
headers.append('Content-Type', 'application/json');
return this.http.get('/restservice/profile/info', {headers: headers})
.map((data: any) => data.json())
.catch(this.handleError);
}
getUserPhotos(myId): any {
var headers = new Headers();
headers.append('Content-Type', 'application/json');
return this.http.get(`restservice/profile/pictures/overview/${ myId }`, {headers: headers})
.map((data: any) => data.json())
.catch(this.handleError);
}
private handleError(error: Response) {
// just logging to the console for now...
console.error(error);
return Observable.throw(error.json().error || 'Server error');
}
}
现在我想在一个组件中运行(或链接)getUserInfo()
和getUserPhotos(myId)
方法。在AngularJS中,我的控制器中会做类似这样的事情,以避免“望塔”的问题...
// Good old AngularJS 1.*
UserData.getUserInfo().then(function(resp) {
return UserData.getUserPhotos(resp.UserId);
}).then(function (resp) {
// do more stuff...
});
现在我尝试在我的组件中做类似的事情(将.then
替换为.subscribe
),但是我的错误控制台疯狂地输出错误信息!
现在我已经尝试在我的组件中进行类似的操作(用.subscribe
替换.then
),但是我的错误控制台却疯狂输出错误信息!
@Component({
selector: 'profile',
template: require('app/components/profile/profile.html'),
providers: [],
directives: [],
pipes: []
})
export class Profile implements OnInit {
userPhotos: any;
userInfo: any;
// UserData is my service
constructor(private userData: UserData) {
}
ngOnInit() {
// I need to pass my own ID here...
this.userData.getUserPhotos('123456') // ToDo: Get this from parent or UserData Service
.subscribe(
(data) => {
this.userPhotos = data;
}
).getUserInfo().subscribe(
(data) => {
this.userInfo = data;
});
}
}
我显然在做错什么……如何最好地使用Observables和RxJS?如果我问了愚蠢的问题,很抱歉……但是在此提前感谢您的帮助!我还注意到在声明我的HTTP标头时,我的函数中有重复的代码...
import { forkJoin } from 'rxjs';
来导入该函数。另外,forkJoin 不再是 Observable 的成员,而是一个独立的函数。因此,不再使用Observable.forkJoin()
,而是使用forkJoin()
。 - Bas