NGRX中withLatestFrom结合skipWhile的动作触发问题咨询
解决方案
问题出在withLatestFrom的使用逻辑上:它会在源流(actions$)发出动作时,立即取另一个流(store的选择器流)的最新值。如果此时store值还为空(skipWhile还没放行),这次动作就会被忽略;而当store终于有非空值时,之前的动作已经处理完毕,后续动作如果触发时store已有值,虽然能执行,但逻辑上不是“等待store非空后再执行”的可靠实现。
正确的做法是,为每个触发的SOME_ACTION单独等待store中的目标值变为非空,再执行接口调用。可以用以下代码实现:
this.actions$.pipe( ofType('SOME_ACTION'), // 每个动作进来后,切换到等待store非空的流 switchMap(action => store.select(someThing).pipe( // 等待第一个非空的state值,拿到后自动完成当前流 first(c => c !== null), // 拿到有效值后调用接口 switchMap(state => hitEndPoint(state.data)) ) ) )
关键操作符说明
switchMap:每个SOME_ACTION触发时,替换为新的等待流;如果新动作到来时前一个等待还未完成,会取消前一个等待(适合不需要保留旧请求的场景,若需保留可替换为concatMap)。first(c => c !== null):替代filter+take(1),专门等待第一个满足“非空”条件的state值,拿到后立即结束当前store订阅,避免内存泄漏。- 内层
switchMap:拿到有效state后,执行接口调用逻辑。
这个方案能保证:无论何时触发SOME_ACTION,都会等待store中的目标值准备好后再执行接口,且每次动作都能独立触发处理逻辑。
内容的提问来源于stack exchange,提问作者Ricardo Silva
相关产品推荐
相关产品推荐

