一段时间后如何取消RXJS订阅

时间:2017-07-09 21:11:56

标签: javascript firebase rxjs observable

如果用户的互联网速度很慢且订阅时间太长(超过30秒),我想取消它。

const k = this.firebase(user)
        .subscribe(data => {

           //some instructions

        },
        error => alert(error),
        () => console.log("finished"));
}
k.unsubscribe();

2 个答案:

答案 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( ... )