You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

RxSwift流链式调用问题:提交后pin变更导致login接口重复调用

问题原因

该问题的核心触发点有两个:

  1. 原有代码在flatMap内部的异步逻辑中才读取pin.value,此时提交后清空pin码的操作已经执行,读取到的是变更后的值,若pin值变更逻辑和提交流存在联动就会触发重复的服务调用
  2. 未对提交请求做串行限制,新的提交事件会直接触发新的服务请求

修正后代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 13:18:03