使用Observable的类之间的通知

时间:2016-07-22 15:17:00

标签: system.reactive rxjs rxjs5

我有一个包含服务器用户列表的类 其他类可以操纵服务器上的列表,例如呼叫添加或删除操作 我的Core-Class引用了其他正在操作服务器列表的类。

我想:

  • 在Core-Class中进行初始化调用以获取开头的列表
  • 每次在服务器上操作列表时,插件都会通知Core-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。我了解工厂方法,热与冷可观察和其他基本的东西。但我无法想象如何以正确的方式使用rx。

感谢。

1 个答案:

答案 0 :(得分: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();

您希望获得更新的Core,插件和其他类只会:

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

请注意,我使用'.share()'来避免重复数据。

可能的改进:

  1. 代替loadUsers方法,让每个插件调用userService.loadSubject.next(true);

  2. 使用背压/缓冲操作符以避免过于频繁的呼叫。例如去抖(小心!使用不当,可能导致饥饿)或bufferWithTime +过滤器(以确保不在空缓冲区上触发)

  3. 使用行为/重播可观察量,以便新订阅者能够快速获得最新价值。