使用RxJS实现debouncing批处理队列

时间:2017-12-23 23:55:25

标签: rxjs

我试图了解RxJS是否适合解决此节点模块执行的问题:https://github.com/ericdolson/debouncing-batch-queue

它的描述说:“当达到其大小或超时时将发出并清除其内容的队列。非常适合聚合批量apis的数据,其中及时批处理是最好的。或者任何真正需要批处理数据的地方。 “

如果是这样,有人可以告诉我如何使用RxJS在这个npm模块中实现这个简单的例子吗?如果可能,最好使用ES5。

2 个答案:

答案 0 :(得分:1)

我不能用ES5做这个:)



const dataWithNamespace = (data, namespace) => ({data, namespace});

const source = [
  dataWithNamespace('ribs 0'),
  dataWithNamespace('ribs 1'),
  dataWithNamespace('ribs 2'),
  dataWithNamespace('ribs 3'),
  dataWithNamespace('ribs 4'),
  dataWithNamespace('more ribs', 'bbq1'),
  dataWithNamespace('more ribs', 'bbq1'),
  dataWithNamespace('brisket', 'best bbq namespace')
];

const DBBQ = (debounceTimeout, maxBatchSize) => 
  source$ => source$
    .groupBy(x => x.namespace)
    .mergeMap(grouped$ => grouped$
      .switchMap(x => 
        Rx.Observable.of(x.data)
          .concat(Rx.Observable.of(undefined)
            .delay(debounceTimeout)
          )
      )
      .bufferCount(maxBatchSize)
      .filter(x => x.length == maxBatchSize)
      .map(x => x.filter(x => x !== undefined))
    );

const source$ = Rx.Observable.from(source);
  
DBBQ(1000, 2)(source$).subscribe(console.log)

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

答案 1 :(得分:1)

bufferwithtimeorcount的操作员。如果您需要它真正等效,输入流将是Subjectgroup_by用于命名空间,如下所示:

var dbbq$ = new Subject();
dbbq$.group_by(function(v_ns) { return v_ns[1]; })
     .flatMap(function(S) {
       return S.bufferwithtimeorcount(1000, 2)
     });
dbbq$.next([ 'ribs 0' ]);
dbbq$.next([ 'more ribs', 'bbq1' ]);

// is analogous to

var dbbq = new DBBQ(1000, 2);

dbbq.add('ribs 0');
dbbq.add('more ribs', 'bbq1');