如何创建一个带有rxjs的pausableBuffer 5

时间:2016-11-11 23:20:38

标签: rxjs rxjs5

我试图做出我认为是pausable buffer

的内容

我有人为此分享了他们的代码,但我无法弄清楚如何将其转换为自定义操作(没有打字稿/只是ES6。

const attach = Rx.Observable.timer(0 * 1000, 8 * 1000).mapTo('@');
const detach = Rx.Observable.timer(4 * 1000, 8 * 1000).mapTo('#');

const input = Rx.Observable.interval(1* 1000);
const pauser = attach.mapTo(true).merge(detach.mapTo(false));

input
  .publish(_input => _input
    .combineLatest(pauser, (v, b) => b)
    .filter(e => e)
    .publish(_switch => _input.bufferWhen(() => _switch.take(1)))
  )
  .flatMap(e => Rx.Observable.from(e))
  .concatMap(e => Rx.Observable.empty().delay(150).startWith(e))

有人可以帮助我创建它,以便我可以input.pausableBuffer(pauser)(并且可能定义一个startsWith)。

1 个答案:

答案 0 :(得分:4)

您可以将其添加到原型中:

var pausableBuffer = function(pauser) {
  return this.publish(_input => _input
    .combineLatest(pauser, (v, b) => b)
    .filter(e => e)
    .publish(_switch => _input.bufferWhen(() => _switch.take(1)))
  )
  .flatMap(e => Rx.Observable.from(e));
}

Rx.Observable.prototype.pausableBuffer = pausableBuffer;

要记住的一件事是,这将在暂停状态下开始。要将其设置为处于活动状态,请将.startWith(true)添加到pauser

var pausableBuffer = function(pauser) {
  return this.publish(_input => _input
    .combineLatest(pauser.startWith(true), (v, b) => b)
    .filter(e => e)
    .publish(_switch => _input.bufferWhen(() => _switch.take(1)))
  )
  .flatMap(e => Rx.Observable.from(e));
}

Rx.Observable.prototype.pausableBuffer = pausableBuffer;