RxJS Observable reset timeout

时间:2017-03-23 10:41:04

标签: timeout rxjs observable

是否可以在设置了另一个超时后重置/增加Observable的超时?在下面的示例中,超时5应该被覆盖,超时为9999,但这不起作用:

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

是否有可能覆盖已设置的超时?

2 个答案:

答案 0 :(得分:0)

简答:据我所知,没有“合法”的解决方案。

Hacky回答:您可以连接到source - ed流的timeout并设置自己的超时,请参阅下面的示例,了解如何完成此操作。 但是,我会建议你在任何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>

答案 1 :(得分: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应该为每个超时值处理取消订阅/重新订阅。