如何创建一个不会在每个简历上重置的RXJS可暂停数据流?

时间:2016-01-27 17:51:06

标签: javascript rxjs

我已经尝试了RXJS可用的文档示例,虽然它暂停了,但它会在恢复时重置。我如何修改下面的例子让我的流从我暂停的地方恢复而不是重置?

  var pauser = new Rx.Subject();

  var source = Rx.Observable
    .interval(1000)
    .timeInterval()
    .pausable(pauser);

  var subscription = source.subscribe(
    function (x) {
        $("#result").append('Next: ' + JSON.stringify(x) + '<br>');
    },
    function (err) {
        $("#result").append('Error: ' + err);
    },
    function () {
        $("#result").append('Completed');
    });


  pauser.onNext(true);

  var paused = false;
  $("#result").click(function() { 
    $(this).append("mouse clicked");
    paused = (paused === false) ? true : false;
    pauser.onNext(paused);
  });

这给了我以下输出:

Next: {"value":0,"interval":1002}
Next: {"value":1,"interval":1000}
Next: {"value":2,"interval":999}
mouse clicked
mouse clicked
Next: {"value":0,"interval":1001}
Next: {"value":1,"interval":999}
Next: {"value":2,"interval":1000}

1 个答案:

答案 0 :(得分:3)

正如pausable文档中所述,pausable将用于热源。

使源热的一种方法是使用share。但是,这不会与pausable一起使用,因为share会在没有订阅者时断开其来源,这会在您暂停时发生。

所以这里有两种方法可以完成这项工作。一种是使用share并保留虚拟订户,以便share永远不会断开其来源,因为总会有至少一个订户。第二种方法是在完成所有布线后使用publishconnect观察点。

带有虚拟订户的

Example 1

  var pauser = new Rx.Subject();

  function noop(){}

  var source = Rx.Observable
    .interval(1000)
    .timeInterval()
    .share();

  var pausableSource = source.pausable(pauser);

  var subscription = pausableSource.subscribe(
    function (x) {
        $("#ta_result").append('Next: ' + JSON.stringify(x) + '<br>');
    },
    function (err) {
        $("#ta_result").append('Error: ' + err);
    },
    function () {
        $("#ta_result").append('Completed');
    });
  source.subscribe(noop);

  pauser.onNext(false);

  var paused = false;
  $("#result").click(function() { 
    $("#ta_change").append("mouse clicked\n");
    paused = !paused;
    pauser.onNext(paused);
  });

Example 2connect

  var pauser = new Rx.Subject();

  var source = Rx.Observable
    .interval(1000)
    .timeInterval()
    .publish();

  var pausableSource = source.pausable(pauser);
//  source.subscribe(function(){});

  var subscription = pausableSource.subscribe(
    function (x) {
        $("#ta_result").append('Next: ' + JSON.stringify(x) + '<br>');
    },
    function (err) {
        $("#ta_result").append('Error: ' + err);
    },
    function () {
        $("#ta_result").append('Completed');
    });

  source.connect();
  pauser.onNext(false);

  var paused = false;
  $("#result").click(function() { 
    $("#ta_change").append("mouse clicked\n");
    paused = !paused;
    pauser.onNext(paused);
  });