关于javascript:如何启动和停止RXJS中可观察到的间隔?

how can start and stop an interval observable in RXJS?

我有一个非常简单的timeInterval可观察的对象,我想开始/停止传输而不断开订户(无论可观察的状态如何,它都应坐下来等待)。 可能,如果可以,怎么办?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var source = Rx.Observable
  .interval(500)
  .timeInterval()
  .map(function (x) { return x.value + ':' + x.interval; })
  .take(10);

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

一般评论:我看到的大多数示例都显示了如何定义可观察对象和订户。 我如何影响现有对象的行为?


取决于停止/恢复信号的来源。 我能想到的最简单的方法是使用pausable运算符,正如文档所述,该运算符与热可观测对象一起使用效果更好。 因此,在下面的示例代码中,我删除了take(10)(您的可暂停信号现在通过pauser主题发出),并添加了share将您的可观察对象变成热点。

  • 关于热与冷,请看一下图示的各个数据流。
  • 在主题上,您还可以查看相应的语义
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
var pauser = new Rx.Subject();
var source = Rx.Observable
  .interval(500)
  .timeInterval()
  .map(function (x) { return x.value + ':' + x.interval; })
  .share()
  .pausable(pauser);

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

  // To begin the flow
pauser.onNext(true); // or source.resume();

// To pause the flow at any point
pauser.onNext(false);  // or source.pause();

这是一个更复杂的示例,它将每10个项目暂停一次源:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
// Helper functions
function emits ( who, who_ ) {return function ( x ) {
 who.innerHTML = [who.innerHTML, who_ +" emits" + JSON.stringify(x)].join("
"
);
};}

var pauser = new Rx.Subject();
var source = Rx.Observable
  .interval(500)
  .timeInterval()
  .map(function (x) { return x.value + ':' + x.interval; })
  .share();
var pausableSource = source
  .pausable(pauser);

source
  .scan(function (acc, _){return acc+1}, 0)
  .map(function(counter){return !!(parseInt(counter/10) % 2)})
  .do(emits(ta_validation, 'scan'))
  .subscribe(pauser);

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

现在,您应该已经回答了第二个问题。 将您获得的可观察物与相关的RxJS运算符相结合,以实现您的用例。 这就是我在这里所做的。