TypeScript를 사용하여 Angular2의 http 데이터에서 RxJS Observables 연결
저는 지난 4 년 동안 AngularJS 1. *를 즐겁게 작업 한 후 현재 Angular2와 TypeScript를 가르치려고 노력하고 있습니다! 나는 그것을 싫어한다는 것을 인정해야하지만 내 유레카 순간이 곧 다가오고 있다고 확신합니다 ... 어쨌든 JSON을 제공하는 전화 백엔드에서 http 데이터를 가져 오는 더미 앱에 서비스를 작성했습니다.
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에서는 컨트롤러에서 "Pyramid of Doom"을 피하기 위해 이와 같은 작업을 수행하는 것처럼 쉬웠습니다.
// Good old AngularJS 1.*
UserData.getUserInfo().then(function(resp) {
return UserData.getUserPhotos(resp.UserId);
}).then(function (resp) {
// do more stuff...
});
지금은 내 구성 요소에서 비슷한 일을 시도 (교체 한 .then
대한 .subscribe
나의 오류 콘솔이 미쳐 가고 그러나)!
@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;
});
}
}
I'm obviously doing something wrong... how would I best with Observables and RxJS? Sorry if I am asking stupid questions... but thanks for the help in advance! I have also noticed the repeated code in my functions when declaring my http headers...
For your use case, I think that the flatMap
operator is what you need:
this.userData.getUserPhotos('123456').flatMap(data => {
this.userPhotos = data;
return this.userData.getUserInfo();
}).subscribe(data => {
this.userInfo = data;
});
This way, you will execute the second request once the first one is received. The flatMap
operator is particularly useful when you want to use the result of the previous request (previous event) to execute another one. Don't forget to import the operator to be able to use it:
import 'rxjs/add/operator/flatMap';
This answer could give you more details:
If you want to only use subscribe
method, you use something like that:
this.userData.getUserPhotos('123456')
.subscribe(
(data) => {
this.userPhotos = data;
this.userData.getUserInfo().subscribe(
(data) => {
this.userInfo = data;
});
});
To finish, if you would want to execute both requests in parallel and be notified when all results are then, you should consider to use Observable.forkJoin
(you need to add import 'rxjs/add/observable/forkJoin'
):
Observable.forkJoin([
this.userData.getUserPhotos(),
this.userData.getUserInfo()]).subscribe(t=> {
var firstResult = t[0];
var secondResult = t[1];
});
'programing tip' 카테고리의 다른 글
파이썬의 사전에서 속성 설정 (0) | 2020.09.09 |
---|---|
IIS : 유휴 시간 초과 대 재활용 (0) | 2020.09.08 |
SQL Server 쿼리의 최대 크기? (0) | 2020.09.08 |
IntelliJ IDEA는 Spring의 @Autowired 주석을 사용할 때 오류를 표시합니다. (0) | 2020.09.08 |
JWT 토큰의 최대 크기는 얼마입니까? (0) | 2020.09.08 |