【问题标题】:Using an observable to retrieve data over http once, then save the value for reuse使用 observable 通过 http 检索数据一次,然后保存该值以供重用
【发布时间】:2016-06-27 09:02:19
【问题描述】:

在 Scala 中,有Futures 的概念,当一个值准备好时,它会在将来保存。我正在努力寻找类似的东西。

例如,我想访问“用户”数据。当我第一次访问这个时,我想向服务器发送一个请求以获取数据,但是对于所有后续访问,我希望能够使用存储的值。

以下代码尝试实现类似的功能。它不保证对服务器的调用只会发生一次。

抱歉,TypeScript 中有以下内容:

class AuthenticationService {

  http: Http = Some Http Helper...

  user: Observable<User> = this.http.get("www.example.com/logged-in-user")
    .map(data => {
      let userObject = data.json().user
      this.user = Observable.of(userObject)
      return userObject
    })
}

有更好的方法吗?

【问题讨论】:

  • 让我看看我是否理解正确:您是否希望曾经订阅 user 的每个人都获得 HTTP GET 的结果,而不仅仅是第一个调用者?

标签: typescript angular promise observable


【解决方案1】:

如果我理解正确,您搜索的是Rx.BehaviorSubject

它将存储最后一个值并发送给任何未来的订阅者:

import Rx from 'rxjs/Rx'; // just for development, use a more specific when done

class AuthenticationService {

  http: Http = Some Http Helper...

  user: Observable<User> = this.http.get("www.example.com/logged-in-user")
    .map(data => {
      let userObject = data.json().user
      this.user = new Rx.BehaviorSubject(userObject)
      return userObject
    })
}

单独的功能示例:

/* Initialize with initial value of 42 */
var subject = new Rx.BehaviorSubject(42);

function subsc(title) {
  subject.subscribe(
    (x) => console.log(title + ' Next: ' + x.toString()),
    (err) => console.log(title + ' Error: ' + err),
    () => console.log(title + ' Completed')
  );
}

subsc("1st"); // Initial Next: 42
subsc("2nd"); // Initial Next: 42

subject.next(56);

subsc("3rd");  // Initial Next: 56

subject.complete();

【讨论】:

  • 感谢您为我指明正确的方向。我通读了所有不同类型的主题,我所追求的是 AsyncSubject。谢谢!
猜你喜欢
  • 2012-01-29
  • 2023-01-28
  • 1970-01-01
  • 2012-12-04
  • 1970-01-01
  • 1970-01-01
  • 2019-09-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多