当前位置:网站首页>优维低代码:Provider 构件
优维低代码:Provider 构件
2022-08-03 11:03:00 【51CTO】


优维低代码技术专栏,是一个全新的、技术为主的专栏,由优维技术委员会成员执笔,基于优维7年低代码技术研发及运维成果,主要介绍低代码相关的技术原理及架构逻辑,目的是给广大运维人提供一个技术交流与学习的平台。
连载第十五期
《高级指引:Provider 构件》
▽
Provider 构件是一种特殊类型的构件,它不提供任何界面展示的能力,仅提供数据处理的能力。配合 useResolves 可以快速实现页面依赖数据的绑定,配合 Events 事件可以实现动态的数据处理。
在 Brick Next 中,将数据与 UI 分离非常重要,一方面可以提升业务构件的可复用性,同时也可以提升产品的可配置能力、可编排能力。
# 创建 Provider 构件
主要有两种快速创建 Provider 构件的方法。
# 使用脚手架工具创建
创建 Provider 构件最简单的方式是使用脚手架工具 yarn yo ,选择 a new package of providers,然后选择一个 API SDK。工具将自动生成一个该 SDK 相关的 Provider 构件库。
初始生成的构件库不包含任何构件,需要在生成的项目文件 providers.json 的 providers 列表中添加对应的接口方法名,例如 "CmdbObjectApi.list"。
# 使用createProviderClass创建
脚手架工具仅提供 API SDK 的 Provider 构件封装,如果想要对 SDK 返回的数据做加工,或者使用其它的个性化数据来源,这时可以使用 createProviderClass 快速创建一个 Provider 构件。例如:
createProviderClass 支持传入任意 Function,它的实现细节请参考本文后面的章节。
# 使用方法
Provider 构件一般用于 useResolves 和 Events 事件。
# 定时更新
现在更推荐使用Provider轮询来实现定时更新的能力。
旧方式的定时更新的示例
在 Provider 构件的属性里声明 interval ,可以实现每隔一段时间就重新拉取数据并通知到构件,例如:
delay 指定每次更新的间隔时间,单位毫秒。默认情况下如果数据更新发生错误,系统将弹出错误警告。设置 ignoreErrors: true 可以不弹出警告。无论何种设置,发生错误时始终会停止接下来的更新。
当需要停止定时更新时,调用 Provider 构件的 $stopInterval() 即可,例如:
⊙ NOTE
从 brick_next 2.18.14 开始支持 $stopInterval。
# 主动更新
现在更推荐使用 Events 事件和 Context 上下文来实现主动更新数据的能力。
旧方式的主动更新的示例
Provider 构件在运行时会对外暴露方法 $refresh(),可以在 TS 中调用或在 Storyboard 中绑定到指定事件,例如:
$refresh() 执行时如果发生错误,系统将弹出错误警告,但不会抛出错误。可以传递选项参数,设置 throwErrors: true 时可以将错误以 Rejected Promise 形式抛出。设置 ignoreErrors: true 时则完全忽略错误,既不弹出错误警告,也不抛出错误。
# 内置属性、方法和事件
现在更推荐使用 Provider 异步回调和 Context 上下文来实现数据分步更新及异步处理的能力,无需使用 Provider 构件的内置属性、方法和事件。
关于内置属性、方法和事件的文档
# 内置属性

# 内置方法
Provider 构件内置有几个方法(method),列举如下:

#内置事件
Provider 构件在执行execute 后(包括 setArgsAndExecute 和 updateArgsAndExecute),将根据执行成功与否分别发送 response.success 和 response.error 事件。

# Provider 异步回调
在以上配置中,如果构件 your-brick 发生了事件 something.happen:
- 系统将使用 Provider 构件 your-provider,调用它的resolve,传递参数 ${EVENT.detail.id};
- 当该异步函数完成后:
- 如果成功,找到构件 another-brick,设置它的属性 instanceData 为上述函数返回的结果;
- 如果失败,使用 console.error 打印上述函数返回的失败原因。
- 无论成功失败,最后都将 your-button 构件的 disabled 属性设置为 false
如果给事件处理器配置了 callback,那么系统在事件触发后,除了执行指定 method 外,还将根据该函数执行结果进行回调调用:method 将被视作异步函数调用,当该函数成功时(resolved),将触发 callback.success 回调,反之(rejected)将触发 callback.error,而无论成功或失败,最后都将触发 callback.finally。这些回调的配置本身又是一个事件配置,因此它可以执行内置动作、或设置其他构件的属性、甚至继续调用其他构件的方法。这些回调传递的 event.detail 在成功时为函数执行的 resolved result,失败时为函数执行的 rejected reason。
基于异步回调驱动的模式相比基于事件驱动的好处在于在同样实现了异步操作的前提下,回调使得操作与响应可以一一对应。事件无法将操作与响应一一对应,对于事件接收方,在收到事件时,很难判断它是自己触发的还是其它对象触发的。
因此事件通常用于旁路处理的场景,例如打印日志、广播通知等。而回调则用于需要将操作和响应对应起来的场景,例如实例的增、删、改、查。
# Provider 轮询
使用 useProvider 作事件处理时,可以激活轮询模式,系统将间隔指定时间轮询对应的接口。
除了使用 progress 来获得接口的实时结果外,也可以让轮询接口对外表现得像普通接口一样。例如假设有一个查询工具执行结果的接口需要轮询以得到最终执行结果,可以这样配置:

# 基于事件驱动的示例
⊙ NOTE
现在更推荐使用 Context 上下文来实现如下的分步表单数据更新。
基于事件驱动的示例
- 当构件your-brick-a发生 something.happen 事件时,系统将找到 your-provider 构件,并更新它关联参数的第一项,更改为该事件 detail 中的 id 对应的值;
- 而当构件your-brick-b发生 something.else.happen 事件时,系统将找到 your-provider 构件,并更新它关联参数的第二项的 name 字段,更改为该事件 detail 中的 name 对应的值
- 接着,当构件 your-brick-c 发生 submit 事件时,系统将调用 your-provider 的 execute 方法,使用前面更新好的关联参数来执行它的关联函数;
- 最后,关联函数执行后,将根据执行成功与否分触发 response.success 和 response.error 事件。
注意 setArgs 接收的参数为一个键值对:patch,系统将遍历这些键值对,分别执行 _.set(provider.args, key, value),因此我们可以实现在不同的事件下更新同一个 Provider 的关联参数的不同部分(例如分步表单里分别更新最终发送的数据)。
相关源码:
边栏推荐
- Skills required to be a good architect: How to draw a system architecture that everyone will love?What's the secret?Come and open this article to see it!...
- 苏州大学:从PostgreSQL到TDengine
- Babbitt | Metaverse daily must-read: Players leave, platforms are shut down, and the digital collection market is gradually cooling down. Where is the future of the industry?...
- VRRP协议的作用及VRRP+OSPF配置方法
- 【TypeScript】为什么要选择 TypeScript?
- Spinner文字显示不全解决办法
- 深度学习经典网络 -- Inception系列(稀疏结构)
- LyScript 实现对内存堆栈扫描
- ETL data cleaning case in MapReduce
- Web Server 设置缓存响应字段的一些推荐方案
猜你喜欢

Polymorphism in detail (simple implementation to buy tickets system simulation, covering/weight definition, principle of polymorphism, virtual table)

如何通过DBeaver 连接 TDengine?

深度学习100例——卷积神经网络(CNN)实现服装图像分类

fast planner中拓扑路径搜索

【多线程的相关内容】

Cross-chain bridge protocol Nomad suffers hacker attack, losing more than $150 million

C#/VB.NET 从PDF中提取表格

全新的Uber App设计

程序员架构修炼之道:如何设计出可持续演进的系统架构?

怎么在外头使用容器里php命令
随机推荐
增加WebView对localStorage的支持
跨链桥协议 Nomad 遭遇黑客攻击,损失超 1.5 亿美元
成为优秀架构师必备技能:怎样才能画出让所有人赞不绝口的系统架构图?秘诀是什么?快来打开这篇文章看看吧!...
CADEditorX ActiveX 14.1.X
LeetCode第三题(Longest Substring Without Repeating Characters)三部曲之二
Summary of redis basics - data types (strings, lists, sets, hashes, sets)
微信小程序获取用户手机号码
XDR平台架构与关键技术解析
[Detailed explanation of binary search plus recursive writing method] with all the code
如何通过DBeaver 连接 TDengine?
巴比特 | 元宇宙每日必读:玩家离场,平台关停,数字藏品市场正逐渐降温,行业的未来究竟在哪里?...
「全球数字经济大会」登陆 N 世界,融云提供通信云服务支持
MySQL - 2059 - Authentication plugin ‘caching_sha2_password‘ cannot be loaded
完全背包问题的思路解析
QT with OpenGL(HDR)
ScrollView嵌套RecyclerView滚动冲突
科普大佬说 | 黑客帝国与6G有什么关系?
历史拉链数据处理有人做过吗
[Output each bit of an integer, from high to low.With and without recursion]
代码分析Objective-C中的深拷贝与浅拷贝