基于 Observable 构建前端防腐策略
Posted 阿里技术
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于 Observable 构建前端防腐策略相关的知识,希望对你有一定的参考价值。
fromFetch(res.json()));
lastValueFrom(forkJoin([getMemoryFreeObservable(), getMemoryUsageObservable()]).pipe(
map(+((usage / (usage + free)) * ));
lastValueFrom(getMemoryFreeObservable());
lastValueFrom(getMemoryUsageObservable());
的实现代码如下,此时该组件将不再依赖具体的接口,而直接依赖防腐层的实现。
( result = getMemoryUsagePercent( setUsage( ) , []);
< 构建所以不需要进行任何改动。
data.data)
);
fromFetch( mergeMap(res.json()),
data.data)
);
free: number;
fromFetch( mergeMap(res.json()),
map(data.data)
);
getMemoryObservable().pipe(map(data.free));
getMemoryObservable().pipe(map(data.usage));
lastValue(getMemoryObservable().pipe(
map(+((usage / (usage + free)) * ));
>
legacyUsage = fromFetch( mergeMap(res.json())
);
legacyFree = fromFetch( mergeMap(res.json())
);
forkJoin([legacyUsage, legacyFree], (
free: free.data.free,
usage: usage.data.usage,
));
>
current = fromFetch( mergeMap(res.json()),
map(data.data)
);
race(getMemoryLegacyObservable(), current);
getMemoryObservable().pipe(map(data.free));
getMemoryObservable().pipe(map(data.usage));
lastValue(getMemory().pipe(
map(+((usage / (usage + free)) * ));
操作符,当 v2 与 v3 任何一个版本的接口可用时,防腐层都可以正常工作,在组件层无需再关注接口受环境的影响。的数据返回,使得组件层可以直接使用百分比数据,而不需要再次进行转换。
cache: [key: string]: any = ;
getData()
( of(
fromFetch( mergeMap((res) => res.json()),
map(( tap(( )
);
race(getMemoryLegacy(), current).pipe(
=> ))
);
forkJoin([getMemoryUsage(), getMemoryFree()]).pipe( map(+((usage / (usage + free)) * );
options = [];
(i = value = options.push(value);
of(options);
五 总结
在本文中我们介绍了以下内容:
前端面对接口频繁变动时的困境及原因如何
防腐层的设计思想与技术选型
使用 Observable 实现防腐层的代码示例
防腐层的额外作用
请读者注意,只在特定的场景下引入前端防腐层才是合理的,即前端处于跟随者或供应商/客户关系中,且面临大量接口无法保障稳定和兼容。如果在防腐层可以在后端 Gateway 构建,或者接口数量较少时,引入防腐层带来的额外成本会大于其带来的好处。
RxJS 在防腐层构建场景下提供的更多的是 Observable 化的能力,如果读者不需要复杂的 operators 转换工具,也可以自行构建 Observable 构建方案,事实上只需要 100 行的代码就可以实现 https://stackblitz.com/edit/mini-rxjs。
改造后的前端架构将不再直接依赖接口实现,不会入侵现有前端数据层设计,还可以承担概念映射、格式适配、接口缓存、稳定性兜底以及协助联调测试等工作。文中所有的示例代码都可以在仓库 https://github.com/vthinkxie/rxjs-acl 获得。