Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 04.12.2017, 19:08
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

Выдача последнего значения в rxJs
В программе есть Observable-объект currentUser. Если пользователь авторизуется или меняется, то сработает подписка:
currentUser.subscribe(user => {...})

Но вдруг возникла такая ситуация, что я подписался на currentUser после того момента как пользователь авторизовался или сменился. Как сделать, чтобы в этом случае сразу после подписки сработал бы коллбэк с последним значением пользователя?
Ответить с цитированием
  #2 (permalink)  
Старый 04.12.2017, 19:30
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

Shitbox2,
BehaviorSubject
Ответить с цитированием
  #3 (permalink)  
Старый 05.12.2017, 14:10
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

А как Observable в BehaviorSubject сконвертить? Что-то ничего простого не нахожу
Ответить с цитированием
  #4 (permalink)  
Старый 05.12.2017, 18:16
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

Shitbox2,
а зачем конвертировать? Subject - дорога в обе стороны. Его можно использовать и как Observable и как Observer.
Ответить с цитированием
  #5 (permalink)  
Старый 05.12.2017, 18:32
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

destus,
Ну так у меня изначально currentUser типа Observable. Нужно его расширить до BehaviorSubject
Ответить с цитированием
  #6 (permalink)  
Старый 05.12.2017, 19:46
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

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>
Ответить с цитированием
  #7 (permalink)  
Старый 08.12.2017, 23:06
Профессор
Отправить личное сообщение для Shitbox2 Посмотреть профиль Найти все сообщения от Shitbox2
 
Регистрация: 04.10.2010
Сообщений: 571

Читал-пробовал. В конкетно этой ситуации 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()

Можно как-нибудь изящнее это сделать?

Последний раз редактировалось Shitbox2, 08.12.2017 в 23:13.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Почему возвращает значения RGB каналов? Black_Star jQuery 14 06.02.2017 04:49
Input type="time" + JS +Safari (iPhone) dpts Opera, Safari и др. 0 21.09.2016 07:24
Input type="time" + JS +Safari (iPhone) dpts Opera, Safari и др. 0 21.09.2016 07:24
Множественные значения в input - ЗА ВОЗНАГРАЖДЕНИЕ! Pb160 Events/DOM/Window 0 03.08.2015 12:29
получение значения из классов karmis Events/DOM/Window 1 14.10.2011 19:09