是否可以在设置了另一个超时后重置/增加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');
});
是否有可能覆盖已设置的超时?
答案 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应该为每个超时值处理取消订阅/重新订阅。