适配器模式
请添加个描述吧
最近在生产环境遇到了下面这样一个场景:
后台在字典表中存储了一些之前需要前后端共同维护的枚举值,并提供根据 type/id
获取字典的 API。所以在渲染列表的时候,有很多列表的字段直接就是字典的 id,而没有经过后台的数据拼装。
也是吾辈之前写的文章 react 通用列表组件封装 中的那个通用列表在实际使用时遇到的问题之一。
起初,吾辈解决问题的流程如下
可以看到,上面的步骤虽然不麻烦,但却十分繁琐,需要定义额外的类型不说,还很容易发生错误。
异步批处理 + LRU 缓存
优化性能formatter
获得更好的使用体验参考实现: batch
实现批处理的基本思路如下
Map
paramCache
缓存传入的 参数 => 剩余调用次数
(该参数还需要查询几次结果)Map
resultCache
缓存 参数 => 结果lock
标识当前是否有函数正在执行lock
标识正在执行paramCache
中对应参数的 剩余调用次数 -1
Error
throw
抛出错误参考: Wiki 缓存算法, 实现 MemoryCache
FIFO
是不合理的LFU
算法呢?它似乎能保留访问最频繁的资源大致实现思路如下
Map
记录 缓存 key => 最后访问时间Pass: 不要吐槽性能很差啦,这个场景下不会缓存特别多的元素啦,最多也就不到 1000 个吧
现在,我们可以结合这两种方式了,同时使用 onceOfSameParam/batch
两个高阶函数来优化 根据 id 获取字典信息 的 API 了。
1 | const getById = onceOfSameParam( |
原本想要支持 ListTable 的异步 formatter
函数,但后来想想,如果 slot
里也包含字典 id 呢?那是否 slot
也要支持异步呢?这可是个比较棘手的问题,所以还是不支持好了。
最终,吾辈在组件与 API 之间添加了
*Service
中间层负责处理数据转换。
请添加个描述吧
请添加个描述吧
请添加个描述吧