我有以下问题: 我需要发送POST请求以从oAuth获取令牌。后来我想通过其他服务创建用户上下文。但我仍然需要保留Observable,因为我想对组件的响应做出反应。
这是一种正确的方法吗?
login(username, password): Observable<any> {
let response$ = this._http.post(params)
.map((response: Response) => response.json());
response$.subscribe(v => this._userService.doSmth());
return response$;
}
修改
我找到了另一种基于@Maximus响应的方法。那是对的 - 我只想做一个请求。所以我写了这样的话:
let response$ = this._http.post(data)
.map((response: Response) => response.json());
let user$ = new Subject<User>();
response$.subscribe(v =>
this._userService.createNewSession(v) // returns observable
.subscribe(u => user$.next(u))
);
return user$.asObservable();
这可以吗?
答案 0 :(得分:2)
此代码:
let response$ = this._http.post(params).map((response: Response) => response.json());
设置一个可观察的链,它本身不做任何事情。只要有人订阅它就会发送http请求。这就是这里发生的事情:
response$.subscribe(v => this._userService.doSmth());
但是response$
指向该链,而不是返回的值。如果其他人再次订阅response$
,则会发出新请求。
如果您想允许订阅response$
并希望系统的其他部分能够访问该值,则应使用AsyncSubject
:
let subject = new AsyncSubject();
let response$ = this._http.post(data).map((response: Response) => response.json()).subscribe(subject);
response$.subscribe(v => this._userService.createNewSession(v));
return response$;