使用RXJS进行数组/哈希操作

时间:2015-10-11 04:46:14

标签: javascript rxjs

由于我对Observables和RXJS很陌生,我想问一个问题: 模拟哈希/数组操作的最佳方法是什么,例如在哈希/数组中添加和删除项目?

我有以下代码片段按预期工作但可能不遵循Observable"方式":



var newMessage = new Rx.Subject(),
  removeMessage = new Rx.Subject(),
  sortMessages = new Rx.Subject(),
  messages = Rx.Observable.merge(
    newMessage.map(function(x) {
      return {
        action: 'add',
        value: x
      };
    }),
    removeMessage.map(function(x) {
      return {
        action: 'remove',
        value: x
      };
    }),
    sortMessages.map(function(x) {
      return {
        action: 'sort',
        value: true
      };
    })
  )
  .scan(function(acc, operation) {
    switch (operation.action) {
      case 'add':
        acc.push(operation.value);
        break;
      case 'remove':
        var removeIndex = acc.indexOf(operation.value);
        if (removeIndex !== -1) {
          acc.splice(removeIndex, 1);
        }
        break;
      case 'sort':
        acc.sort(function(a, b) {
          return a > b;
        });
        break;
    }
    return acc;
  }, []);

var subscription = messages.subscribe(
  function(x) {
    console.log('next ' + x);
  },
  function(err) {
    console.log('Error: %s', err);
  },
  function() {
    console.log('Completed');
  });

newMessage.onNext(4);
newMessage.onNext(2);
newMessage.onNext(1);
removeMessage.onNext(2);
removeMessage.onNext(1);
newMessage.onNext(3);
sortMessages.onNext(true);

<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/4.0.1/rx.all.js"></script>
&#13;
&#13;
&#13;

我希望能够通过各种主题推送任意类型的通知(添加,删除,排序,查找)并检索最终结果,这是我已经提交的所有过去指令的总和(没有流从头开始经历所有指令,这是不好的表现。)

使用数组和散列的经典方法似乎更简单,但是必须有一个适当的Observables方法,不是吗?

1 个答案:

答案 0 :(得分:2)

好的,我已经参与了这个Angular2-rxjs-chat演示,它以非常优雅的方式完成了我正在寻找的东西。

为了简化它们,它们使用动作或操作流(插入,标记等),每个动作或操作都是一个Subject,在扫描Observable中调用并改变列表的最后状态。

这是以最平坦和最通用的方式完成的。 路要走!