2017-03-23 47 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應該爲每個超時值取消訂閱/重新訂閱。