【问题标题】:Create observable, subscribe to it and return it创建 observable,订阅并返回
【发布时间】:2017-07-12 09:32:31
【问题描述】:

我有以下问题: 我需要发送 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();

这样好吗?

【问题讨论】:

  • 但我仍然需要保留 Observable,因为我想对组件的响应做出反应。 - 为什么?你打算用它做什么?
  • 我想要一个组件对“用户记录的事件”做出反应。

标签: angular rxjs reactive-programming


【解决方案1】:

这段代码:

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$;

【讨论】:

  • @ŁukaszSzcześniak,你现在有什么问题?
  • 对不起,我忘了问。我只是想知道是否有更好的方法。
  • @ŁukaszSzcześniak,实际上,AsyncSubject 是一个更好的选择。我更新了代码。如果有帮助,请告诉我。
  • 我认为你是对的,尽管我必须了解更多有关科目的知识。感谢您的宝贵时间。
  • @ŁukaszSzcześniak,见this explanation
猜你喜欢
  • 1970-01-01
  • 2020-02-03
  • 2016-12-30
  • 2017-02-17
  • 2018-09-01
  • 2019-03-09
  • 1970-01-01
  • 1970-01-01
  • 2015-10-21
相关资源
最近更新 更多