Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/416.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何启动和停止RXJS中可观察到的间隔?_Javascript_Rxjs - Fatal编程技术网

Javascript 如何启动和停止RXJS中可观察到的间隔?

Javascript 如何启动和停止RXJS中可观察到的间隔?,javascript,rxjs,Javascript,Rxjs,我有一个非常简单的可观测时间间隔,我希望在不断开订户连接的情况下启动/停止传输(无论可观测状态如何,订户都应该坐着等待)。是可能的,如果可能,如何实现 var source = Rx.Observable .interval(500) .timeInterval() .map(function (x) { return x.value + ':' + x.interval; }) .take(10); var subscription = source.subscribe(

我有一个非常简单的可观测时间间隔,我希望在不断开订户连接的情况下启动/停止传输(无论可观测状态如何,订户都应该坐着等待)。是可能的,如果可能,如何实现

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');
  });

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

取决于停止/恢复信号的来源。我能想到的最简单的方法是使用,正如文档中所说,使用热观测效果更好。因此,在下面的示例代码中,我删除了
take(10)
(您的暂停信号现在通过
pauser
主题传递),并添加了
share
,以将您的可观察状态转变为热点

  • 关于热与冷,看一看
  • 关于主题,您还可以查看
以下是每10项暂停一次源代码的示例:

// Helper functions
function emits ( who, who_ ) {return function ( x ) {
 who.innerHTML = [who.innerHTML, who_ + " emits " + JSON.stringify(x)].join("\n");
};}

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操作符结合起来,以实现您的用例。这就是我在这里所做的。

不是最优雅的,但可能是最简单的:

  timeSubscription: Subscription
  timer: Observable<number>;
  time = 0;

toggle() {
if (!this.timer)
  this.timer = interval(500);

if (!this.timeSubscription || this.timeSubscription.closed)
  this.timeSubscription = this.timer.subscribe(tick => { // running
    console.log(this.time++);
  });
else
  this.timeSubscription.unsubscribe(); // not running 
}
timeSubscription:订阅
定时器:可观察;
时间=0;
切换(){
如果(!this.timer)
此计时器=间隔(500);
如果(!this.timeSubscription | | this.timeSubscription.closed)
this.timeSubscription=this.timer.subscribe(勾选=>{//running
console.log(this.time++);
});
其他的
this.timeSubscription.unsubscribe();//未运行
}

谢谢您的回复。我添加了一个暂停/播放按钮,我注意到流在每次恢复时都会重置,因此它并没有完全按照我的需要执行,即在不重新启动的情况下冻结/恢复。你知道热的和冷的可观察流之间的区别吗。请看这里:。如果您的流正在重置,这可能意味着您正在使用一个冷的可观察对象,即每次有新订户时“重置”的可观察对象。确保的唯一方法是查看您的代码。在我的示例中,我添加了一个
.share()
,以确保流在传递给
pausable
操作符之前是热的。否则我会有和你现在一样的问题。
  timeSubscription: Subscription
  timer: Observable<number>;
  time = 0;

toggle() {
if (!this.timer)
  this.timer = interval(500);

if (!this.timeSubscription || this.timeSubscription.closed)
  this.timeSubscription = this.timer.subscribe(tick => { // running
    console.log(this.time++);
  });
else
  this.timeSubscription.unsubscribe(); // not running 
}