如果用户的互联网速度很慢且订阅时间太长(超过30秒),我想取消它。
const k = this.firebase(user)
.subscribe(data => {
//some instructions
},
error => alert(error),
() => console.log("finished"));
}
k.unsubscribe();
答案 0 :(得分:8)
查看Operators文档,您会发现很多有趣的事情。
只需使用Timeout运算符,该运算符专门用于此情况:
const k = this.firebase(user)
.timeout(30 * 1000)
.subscribe(
data => { /* do stuff*/ },
error => { /* handle it */ },
() => { /* finished */ }
);
timeout
将等待一个值发出到时间限制,此时它将以失败结束observable。
这意味着如果在30秒内没有收到任何内容,将调用error
处理程序,如果需要,您可以使用它来通知用户。
更新:显然,Firebase客户端会在收到值后保持可观察的运行(可能会让您收到进一步更新的通知)。由于Observable永远不会完成,因此Timeout将在收到数据后的30秒(或任何您作为持续时间传递的时间)之后执行操作,从而导致流失败。
转换"流媒体"可观察到单事件Observable,在超时之前使用Take运算符:
this.firebase(user)
.take(1)
.timeout(wait)
.subscribe(/* etc */);
答案 1 :(得分:2)
您可以使用计时器运算符创建另一个Observable流,并侦听流k直到计时器流完成。
例如:
const timer$ = Observable.timer(30000) // time in ms
const k$ = this.firebase(user)
.takeUntil(timer$) // subscribe to k$ until the timer$ finishes
.subscribe( ... )