2017-01-10 5 views
4

Я работаю над Portal в Angular 2. При входе я делаю запрос на сервер, чтобы получить зарегистрированный профиль пользователя. Метод для извлечения профиля пользователя возвращает наблюдаемый, который подписывается в 6 разных местах, когда приложение загружается.Обновить/перезагрузить последовательность Hot Observable с помощью RxJS

Если я использовал холодный наблюдаемый, это приведет к 6 вызовам API на сервер. Поэтому я переключился на горячий наблюдаемый, добавив .publishLast(). RefCount().

Это привело к единому запросу, совместно использующему данные, поскольку профиль пользователя не обновляется при последующих запросах.

Проблема начинается здесь:

Теперь у меня есть Редактировать функциональность Профиль которая обновляет профиль пользователя через HTTP PUT и, как следствие этого, я хотел бы истекать ранее подписался наблюдаемыми и как-то триггер последовательность снова, так что API выполняется снова, и подписки получают обновленные данные.

Есть ли способ, которым я мог бы перезапустить/перезапустить уже подписанную наблюдаемую последовательность?

Вот код для выборки пользователя наблюдаемого

fetch(){ 
    this.userObservable = Observable.fromPromise(this.getToken()) 
     .switchMap(token => { 
     let headers = new Headers(); 
     headers.append('Authorization', `Bearer ${token}`); 
     return this.http.get('/api/v1/admin/users/me?includes=role', {headers: headers}) 
     }) 
     .map((res: Response) => { 
     let retVal: any = { 
      data: new Deserializer({ 
      keyForAttribute: 'camelCase' 
      }).deserialize(res.json()) 
     }; 
     this.user = retVal.data as MpUser; 
     this.user.role = MpRoles[retVal.data.role[0].name]; 
     return this.user; 
     }) 
     .publishLast() 
     .refCount(); 
    } 

ответ

4

Вы можете попробовать ввести subject для запуска выборки:

private fetchTrigger = new BehaviorSubject(null); 

triggerFetch() { 
    this.fetchTrigger.next(); 
} 

fetch() { 
    this.userObservable = Observable 
    .combineLatest(
     Observable.fromPromise(this.getToken()), 
     this.fetchTrigger 
    ) 
    .switchMap(([token]) => { 
     ... 
    }) 
    ... 
    .publishLast() 
    .refCount(); 
} 

Обратите внимание, что в этом примере token извлекаются только один раз. Если вам нужно получить новый токен при каждом обновлении:

private fetchTrigger = new BehaviorSubject(null); 

triggerFetch() { 
    this.fetchTrigger.next(); 
} 

fetch() { 
    this.userObservable = this.fetchTrigger 
    .switchMap(() => Observable.fromPromise(this.getToken())) 
    .switchMap(token => { 
     ... 
    }) 
    ... 
    .publishLast() 
    .refCount(); 
} 
+0

Я боюсь, что это не сработает, потому что токен обновляется после таймаута. Мы используем Keycloak SSO для аутентификации. –

+0

@Mohammad Umair Khan, Проверьте ответ –

+0

BehaviorSubject вернет инициализированное значение по первой подписке, а не ждет завершения вызова API. Это ломает поток, я пытаюсь с Темами, но пока не везет. –