RxJS如何仅当值非Observable时转为Observable并组合登录校验逻辑
优化实现方案
RxJS 本身已经提供了适配多类型输入的内置能力,不需要手动做类型判断,优化后的代码如下:
import { of, from, Observable } from 'rxjs'; import { mergeMap } from 'rxjs/operators'; const getRandomBool: () => boolean = () => Math.random() >= 0.5; const getRandomCheck: () => boolean | Observable<boolean> = () => { return getRandomBool() ? getAsyncCheck() : getSyncCheck(); }; const myFunction = (): Observable<boolean> => { // 第一项:用户登录状态校验,真实场景替换为UserService返回的Observable即可 return of(getRandomBool()) .pipe( mergeMap(isLogged => { // 未登录直接返回false,不需要走后续校验 if (!isLogged) return of(false); // from 会自动适配普通布尔值、Observable两种返回类型,无需手动判断包装 return from(getRandomCheck()); }) ) };
优化点说明
- 精简类型判断逻辑:直接使用RxJS内置的
from方法,它天生支持把普通值、Promise、Observable等多种输入统一转换为Observable类型,完全替代了你原来的iif手动类型判断逻辑,代码更简洁也不会出现类型判断失误的问题。 - 修正返回值类型:原函数标注的返回值
Observable<boolean> | boolean不符合实际逻辑,外层用of+管道操作符返回的一定是Observable类型,修正后类型更准确,也方便调用方统一用subscribe处理结果。 - 可读性优化:把
of(!1)替换为of(false),业务语义更清晰,降低后续维护成本。
高阶重构方案(适合多场景复用)
如果多个业务模块都需要「先校验登录态再执行业务校验」的逻辑,可以抽成通用的组合函数:
/** * 通用登录态+业务校验组合函数 * @param bizCheck 业务校验函数,支持返回普通值或Observable */ const combineAuthCheck = <T>(bizCheck: () => T | Observable<T>): Observable<T | boolean> => { // 替换为真实UserService的登录态校验Observable return of(getRandomBool()) .pipe( mergeMap(isLogged => isLogged ? from(bizCheck()) : of(false)) ) } // 业务侧调用时直接传入对应业务校验函数即可 const myFunction = () => combineAuthCheck(getRandomCheck);
内容的提问来源于stack exchange,提问作者OtaconKiko
相关产品推荐
相关产品推荐

