2017-03-23 82 views
2

是否可以在已设置另一个超时后重置/增加Observable的超时?在下面的例子中的5超时应与9999超时被覆盖,但是这并不工作:RxJS可观察重置超时

var source = Rx.Observable 
.return(42) 
.delay(1000) 
.timeout(5) 
.timeout(9999); // this statement should override the previous set timeout of 5 MS, but actually it does not 

var subscription = source.subscribe(
function (x) { 
    console.log('Next: ' + x); 
}, 
function (err) { 
    console.log('Error: ' + err); 
}, 
function() { 
    console.log('Completed'); 
}); 

是否有任何可能性,以覆盖已经设置超时?

+0

当您想要更改超时时,您可以重新订阅吗?然后,你可以在订阅时间,如source.timeout(timeoutVariable).subscribe(....),以及desubscribeing - 当timeoutVariable改变时重新订阅....实际上,有什么办法可以将这个改变事件放入一个流?编辑 - 哟,提交posible答案 – olivarra1

回答

0

简短回答:据我所知,目前还没有“合法”的解决办法。


哈克答案:你可以连接到timeout -ed流的source,并设置自己的超时,请参见下面怎么可以这样做的例子。 但是,我会而不是建议你在任何seriouse项目中都这样做 - 我相信应该有另一种解决方案来解决你的问题。

var base = Rx.Observable 
 
.return(42) 
 
.delay(1000) 
 
.timeout(1); 
 

 
var patched = base.source.timeout(2000); 
 

 
var subscription = patched.subscribe(
 
function (x) { 
 
    console.log('Patched Next: ' + x); 
 
}, 
 
function (err) { 
 
    console.log('Patched Error: ' + err); 
 
}, 
 
function() { 
 
    console.log('Patched Completed'); 
 
}); 
 

 
var subscription = base.subscribe(
 
function (x) { 
 
    console.log('Base Next: ' + x); 
 
}, 
 
function (err) { 
 
    console.log('Base Error: ' + err); 
 
}, 
 
function() { 
 
    console.log('Base Completed'); 
 
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/4.1.0/rx.all.js"></script>

0

有关,如果你使用的对象来表示你的超时值是什么?

timeoutSubject = new Rx.ReplaySubject(1); 
timeoutSubject 
    .asObservable() 
    .switchMap((v) => source.timeout(v)) 
    .subscribe((r) => console.log(r)); 

timeoutSubject.next(5); 
timeoutSubject.next(9999); 

switchMap应该为每个超时值取消订阅/重新订阅。