RxSwift流链式调用问题:提交后pin变更导致login接口重复调用
问题原因
该问题的核心触发点有两个:
- 原有代码在
flatMap内部的异步逻辑中才读取pin.value,此时提交后清空pin码的操作已经执行,读取到的是变更后的值,若pin值变更逻辑和提交流存在联动就会触发重复的服务调用 - 未对提交请求做串行限制,新的提交事件会直接触发新的服务请求
修正后代码
var state: Observable<State> { return Observable.merge( .just(.inactive), submit // 提交事件触发时立即捕获当前pin值,后续pin变更不影响本次请求参数 .map { [pin] in pin.value } // flatMapFirst会在当前请求未完成时忽略所有新的提交事件 .flatMapFirst { [service] currentPin in service.login(pin: currentPin).asObservable() .map { _ in State.active } .catch { _ in .just(.inactive) } .startWith(.loading) } ) }
修正点说明
- 提交事件触发时就通过
map操作拿到当时的pin值,后续清空pin的操作不会影响本次请求使用的参数,满足仅在提交时获取一次pin值的需求 - 用
flatMapFirst替代默认的flatMap,保证前一次登录请求未完成时,所有新的提交事件和pin值变更都不会触发新的服务调用,前次请求结束后才会响应下次提交操作 - 原有状态流转逻辑完全保留:初始状态为
.inactive,提交后立刻进入.loading,请求成功变为.active,请求失败退回.inactive,符合业务要求
内容的提问来源于stack exchange,提问作者Vahid
相关产品推荐
相关产品推荐

