为了账号安全,请及时绑定邮箱和手机立即绑定

请问是否有必要从http方法创建的可观测数据中取消订阅?

/ 猿问

请问是否有必要从http方法创建的可观测数据中取消订阅?

PHP
明月笑刀无情 2019-10-22 17:12:36

是否有必要从http方法创建的可观测数据中取消订阅?

您需要取消订阅角2 http调用以防止内存泄漏吗?

 fetchFilm(index) {
        var sub = this._http.get(`http://example.com`)
            .map(result => result.json())
            .map(json => {
                dispatch(this.receiveFilm(json));
            })
            .subscribe(e=>sub.unsubscribe());
            ...


查看完整描述

3 回答

?
慕田峪7331174

所以答案是不,你没有。Ng2会把它清理干净的。

http服务源,来自角的HTTPXHR后端源:

注意它是如何运行complete()在得到结果之后。这意味着它实际上在完成时取消订阅。所以你不需要自己动手。

下面是一个验证的测试:

  fetchFilms() {
    return (dispatch) => {
        dispatch(this.requestFilms());

        let observer = this._http.get(`${BASE_URL}`)
            .map(result => result.json())
            .map(json => {
                dispatch(this.receiveFilms(json.results));
                dispatch(this.receiveNumberOfFilms(json.count));
                console.log("2 isUnsubscribed",observer.isUnsubscribed);
                window.setTimeout(() => {
                  console.log("3 isUnsubscribed",observer.isUnsubscribed);
                },10);
            })
            .subscribe();
        console.log("1 isUnsubscribed",observer.isUnsubscribed);
    };
}

正如预期的那样,您可以看到,在得到结果并使用可观察的运算符完成之后,它总是自动取消订阅。这种情况发生在超时(#3)上,这样我们就可以在完成和完成时检查可观察到的状态。

所以,不会有泄漏Ng2自动取消订阅!

很高兴提到:这个Observable被归类为finite,与infinite Observable,它是一个无限数据流,可以像DOM一样发出。click例如听众。

“谢谢,”鲁比男孩在这方面的帮助。



查看完整回答
反对 回复 2019-10-23
?
元芳怎么了

你们这些人在说什么!

好的,有两个理由可以不订阅任何可以观察到的东西。似乎没有人在谈论非常重要的第二个原因!

1)清理资源。正如其他人所说,对于HTTP可观察性而言,这是一个可以忽略不计的问题。它只会把自己清理干净。

2)防止subscribe处理程序被运行。

(对于HTTP,这实际上也会取消浏览器中的请求,因此不会浪费时间读取响应。但这实际上是我下面主要观点的一个旁白。)

数字2的相关性将取决于您的订阅处理程序所做的工作:

如果你subscribe()如果关闭或处理任何调用,则必须取消订阅(或添加条件逻辑),以防止执行处理程序函数。

考虑几个案例:

1)登入表格。输入用户名和密码,然后单击“登录”。如果服务器速度慢,您决定点击Escape关闭对话框怎么办?您可能会假设您没有登录,但是如果在您单击转义之后返回的HTTP请求,那么您仍然会执行您在那里拥有的任何逻辑。这可能导致重定向到帐户页、设置不必要的登录cookie或令牌变量。这可能不是您的用户所期望的。

2)“发送电子邮件”表格。

如果subscribe“sendEmail”的处理程序会触发‘您的电子邮件被发送’的动画,将您转移到另一个页面,或者尝试访问任何已处理过的内容,您可能会得到异常或不想要的行为。

也要小心不要假设unsubscribe()意思是“取消”。HTTP消息启动后unsubscribe()如果HTTP请求已经到达您的服务器,则不会取消它。它只会取消回复你的回复。这封邮件很可能会被发送出去。

如果您创建订阅以直接在UI组件内发送电子邮件,那么您可能希望取消对Dispose的订阅,但是如果电子邮件是由非UI集中服务发送的,那么您可能不需要这样做。

(3)被破坏/关闭的角分量。除非您取消订阅,否则任何此时仍在运行的http可观测数据都将完成并运行它们的逻辑。onDestroy()..结果是否微不足道将取决于您在订阅处理程序中所做的事情。如果尝试更新不存在的内容,可能会出现错误。

有时,如果处理组件,您可能会想要一些操作,而有些操作则不会,例如,您可能对发送的电子邮件发出了“swoosh”的声音。即使关闭了组件,您也可能希望它发挥作用,但如果试图在组件上运行动画,则会失败。在这种情况下,订阅内部的一些额外的条件逻辑将是解决方案-而且您不希望取消订阅http可观察到的内容。

因此,在回答实际问题时,不需要这样做就可以避免内存泄漏。但是,您需要(经常)这样做,以避免运行可能引发异常或损坏应用程序状态的代码触发不必要的副作用。

提示:Subscription包含closed在高级情况下可能有用的布尔属性。对于HTTP,这将在它完成时设置。在角度上,在某些情况下设置_isDestroyed财产ngDestroy可以由您的subscribe处理程序。

提示2:如果处理多个订阅,则可以创建一个即席订阅。new Subscription()对象和add(...)对它的任何其他订阅-所以当您从主订阅取消订阅时,它也将取消订阅所有添加的订阅。



查看完整回答
反对 回复 2019-10-23
?
慕的地2183247

调用unsubscribe方法是取消正在进行的HTTP请求,因为此方法调用abort一个在底层XHR对象上,并删除加载和错误事件上的侦听器:

// From the XHRConnection class
return () => {
  _xhr.removeEventListener('load', onLoad);
  _xhr.removeEventListener('error', onError);
  _xhr.abort();
};

尽管如此,unsubscribe移除听众.。所以这可能是个好主意,但我不认为一个请求是必要的;-)



查看完整回答
反对 回复 2019-10-23

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信