2016-07-22 2 views
1

У меня есть класс со списком пользователей с сервера.
Другие классы могут манипулировать списком на сервере, например. вызовите команду add или delete.
My Core-Class имеет ссылку на другие классы, которые манипулируют списком на сервере.Уведомление между классами с использованием Observable

Я хотел бы:

  • Сделать инициализации вызова в ядро-класса, чтобы получить список на начало
  • Ядро-Class будет уведомлен плагинов каждый раз, когда список был манипулируют на сервер, поэтому Core-Class снова получит список с сервера.
  • Сообщите другим классам, что список был перезагружен и перенаправлен новый список.

Моя структура

Core { 

    users: []; 

    plugin1: Plugin; 
    plugin2: Plugin; 

    //Get a new list of users from the server 
    loadUsers() { 
     userService.loadUsers.then(function (res) { 
     this.users = res; 
     }) 
    } 

    } 

    Plugin { 

    //sends a request to the server to create a special user, 
    //depending on plugin implementation 
    createUser(); 
    } 

Я только начинаю использовать гх. Я понимаю фабричные методы, горячие и холодные наблюдаемые и другие основные вещи. Но я не могу представить, как это сделать с помощью rx правильно.

Спасибо.

+0

«Уведомлять другие классы о том, что список был перезагружен и переадресован новый список». Разве вы не можете просто создать наблюдаемый в Core и другие классы подписываться на него? Вы можете либо сделать наблюдаемый атрибут класса, либо добавить метод подписки, который позволил бы сопутствующим классам самостоятельно/подписаться. – pdoherty926

+0

Скажем, я создаю наблюдаемый, чтобы обновить список. Другие классы подписываются на него, чтобы получать уведомление, когда есть новый список. Как это наблюдаемое может быть вызвано некоторым классом, требующим обновления. – user5931608

+0

1) Потребители не должны/не должны знать разницу между «обновлением» и, тем не менее, значения добавляются в список. 2) Добавьте метод обновления в Core, который извлекает некоторые данные, а затем помещает его в поток. – pdoherty926

ответ

1

Моя идея реактивной реализации будет:

В вашем UserService добавить следующее:

var loadSubject = new Subject(); 
var usersObservable = loadSubject.flatMap(
    Observable.fromPromise(<your http call that returns promise>)).share() 

function loadUsers(){ 
    loadSubject.next(true); 
} 

Затем каждый плагин, который внес изменения будут просто позвонить:

userService.loadUsers(); 

ваш основной, плагины и другие классы, которые хотели бы получить обновление, просто сделают:

loadService.usersObservable.subscribe(function(usersFreshValue){ 
    this.users = usersFreshValue; 
}) 

Обратите внимание, что я использовал «.share()», чтобы избежать дублирования данных.

Возможные улучшения:

  1. Вместо метода loadUsers, имеют каждый плагин userService.loadSubject.next вызова (истинный);

  2. Использование операторов противодавления/буферизации, чтобы избежать слишком частых вызовов. Например, debounce (ПРЕДУПРЕЖДЕНИЕ! При неправильном использовании, может привести к голоданию) или bufferWithTime + фильтр (чтобы убедиться, что вы не запускаете пустые буферы)

  3. Используйте поведенческие/повторные наблюдения, чтобы новые подписчики быстро получили последние стоимость.

+0

До сих пор требуется доля, если я использую тему. Является ли объект не горячим/многоадресным? – user5931608

+0

Хотел бы я знать :-) Я использовал этот ресурс, чтобы избежать дублирования данных с каждым абонентом. – Meir

 Смежные вопросы

  • Нет связанных вопросов^_^