Использование observable для получения данных через http один раз, а затем сохранить значение для повторного использования

0

В 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
    })
}

Есть ли лучший способ сделать это?

  • 0
    Позвольте мне понять, правильно ли я понимаю: вы хотите, чтобы каждый, кто когда-либо подписывался на user получал результат этого HTTP GET, а не только первый вызывающий?
Теги:
angular
promise
observable

1 ответ

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();
  • 0
    Спасибо, что указал мне правильный путь. Я прочитал все различные типы предметов, и тот, который я ищу, называется AsyncSubject. Спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню