嵌套使用RxJS iif运算符未达预期效果的问题排查
问题分析与解决
问题出在RxJS的iif操作符参数执行时机上:你直接传入了this.allocatEquipment(of(eq))这类表达式,这些代码会在iif创建时立即执行,而非等到条件判断为真时才执行。哪怕外层iif的条件(eq不为空数组)不满足,内层iif里的allocatEquipment调用已经提前触发了。
修复代码
把内层iif的两个分支包装成工厂函数,让函数体只有在条件匹配时才会执行:
... tap(a => console.log(a)), // logs [] length:0 concatMap(eq => iif(() => Array.isArray(eq) && eq.length > 0, // 用函数包裹,只有dryRun为true时才执行of(eq) () => iif(() => dryRun, of(eq), this.allocatEquipment(of(eq))), EMPTY ) )
或者更严谨的写法,把所有分支都用函数包裹:
... tap(a => console.log(a)), concatMap(eq => iif( () => Array.isArray(eq) && eq.length > 0, () => iif( () => dryRun, () => of(eq), () => this.allocatEquipment(of(eq)) ), () => EMPTY ) )
核心原因
RxJS的iif如果接收的是普通表达式(而非函数),会在创建操作符时就立即解析执行,而非延迟到条件判断通过后。所以当你传入this.allocatEquipment(of(eq))时,不管dryRun或eq的状态如何,这个函数都会被提前调用,导致不符合预期的行为。
内容的提问来源于stack exchange,提问作者Jnr
相关产品推荐
相关产品推荐

