使用observable通过http检索数据一次,然后保存该值以便重用

时间:2016-06-27 00:24:26

标签: typescript angular promise observable

在scala中,存在Futures的概念,其中值在将来准备好时将被保存。我试图找到类似的东西。

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

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

道歉,以下是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
    })
}

有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

如果我理解正确,您要搜索的是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();