我有一个非常简单的timeInterval可观察的对象,我想开始/停止传输而不断开订户(无论可观察的状态如何,它都应坐下来等待)。可能,如果可以,怎么办?
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
operator,正如文档所述,它与热可观测对象一起使用效果更好。因此,在以下示例代码中,我删除了take(10)
(您的可暂停信号现在通过pauser
主题发出),并添加了share
将您的可观察对象变成热点。
这是一个more sophisticated example,它将每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运算符相结合,以实现您的用例。这就是我在这里所做的。
关于javascript - 如何启动和停止RXJS中可观察到的间隔?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34996725/