RxJS中complete与add的区别及加载Spinner的最优选择
RxJS中complete回调与add方法的区别及Spinner停止方案
先给你拆解清楚两者的作用和差异:
一、complete回调的作用
complete是调用subscribe时传入的回调之一,只有当Observable数据流正常结束(没有发生任何错误)的时候才会触发。举个例子:
- 如果你的
getMemberProfile请求成功返回数据、没有报错,complete会执行; - 但如果请求失败触发了
error回调,complete根本不会被调用。
二、add方法的作用
add是subscribe返回的Subscription对象的方法,用来添加一段「清理逻辑」。不管Observable是正常完成、抛出错误,还是你主动调用unsubscribe取消订阅,这段逻辑都会执行。简单说就是,只要这个订阅的生命周期结束了,add里的代码就一定会跑。
三、两者的核心区别
- 触发时机范围不同:
complete只覆盖「无错误正常完成」这一种场景;add覆盖所有订阅结束的场景:成功完成、请求失败、主动取消订阅。
- 所属体系不同:
complete属于Observable的订阅回调体系,是数据流正常结束时的通知;add属于订阅的清理机制,用来处理订阅结束后的收尾工作。
四、关于停止Spinner的选择
你的需求是不管请求成功还是失败,都要停止加载Spinner——甚至如果用户中途取消请求(比如跳转页面),Spinner也该停下。这种场景下用add才是正确的,如果换成complete,一旦请求出错,complete不会执行,Spinner就会一直转下去,这显然不符合预期。
看你现在的代码同时写了complete和add,其实完全没必要,只保留add里的停止Spinner逻辑就行,避免重复执行。
内容的提问来源于stack exchange,提问作者chuckd
相关产品推荐
相关产品推荐

