Выдача последнего значения в rxJs
В программе есть Observable-объект currentUser. Если пользователь авторизуется или меняется, то сработает подписка:
currentUser.subscribe(user => {...}) Но вдруг возникла такая ситуация, что я подписался на currentUser после того момента как пользователь авторизовался или сменился. Как сделать, чтобы в этом случае сразу после подписки сработал бы коллбэк с последним значением пользователя? |
Shitbox2,
BehaviorSubject |
А как Observable в BehaviorSubject сконвертить? Что-то ничего простого не нахожу
|
Shitbox2,
а зачем конвертировать? Subject - дорога в обе стороны. Его можно использовать и как Observable и как Observer. |
destus,
Ну так у меня изначально currentUser типа Observable. Нужно его расширить до BehaviorSubject |
Shitbox2,
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.5.3/Rx.min.js"></script> <script> const bs = new Rx.BehaviorSubject(null); bs.subscribe(user => console.log(user)) const currentUser = new Rx.Observable.of({login: 'test'}) currentUser.subscribe(bs); </script> |
Читал-пробовал. В конкетно этой ситуации BehaviorSubject подходит, но проблема оказалась шире. Дело в том, что при получении значения вызывается complete и BehaviorSubject не срабатывает (можно использовать ReplaySubject или AsyncSubject, но проблема не в этом). Собственно встала задача превратить завершенный observable в незавершенный. Чтобы это примерно так работало:
const currentUser$ = users.getCurrent() //get user 1 currentUser$.subscribe(user => console.log(user)) // user 1, user2 setTimeout(() => { users.getCurrent() //get user 2 }, 1000) setTimeout(() => { currentUser$.subscribe(user => console.log(user)) //user 2 }, 2000) Пока на ум только самые топорные решения приходят в духе: class Users { observer; observable$ = new Observable(observer => { this.observer = observer; }); getCurrent() { getCurrentUser().subscribe(this.observer.next); return this.observable$; } } const users = new Users() Можно как-нибудь изящнее это сделать? |
Часовой пояс GMT +3, время: 06:59. |