news 2026/7/10 15:31:05

H5 如何调用 ArkTS:JavaScriptProxy、requestId 和 Promise 回调

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
H5 如何调用 ArkTS:JavaScriptProxy、requestId 和 Promise 回调

H5 如何调用 ArkTS:JavaScriptProxy、requestId 和 Promise 回调

项目地址:https://github.com/lichenyang5/MiniAppRuntime-Harmony
本文是 MiniAppRuntime-Harmony 系列的第三篇,重点讲 H5 到 ArkTS 的最小通信边界。

1. JSBridge 的本质是什么

JSBridge 听起来很抽象。

但拆开看,它其实只做两件事:

H5 把请求发给 Native Native 把结果回给 H5

问题在于,这两个动作都不是同步的。

H5 调用:

window.myascf.send("ui.showToast",{message:"hello from h5"})

它希望拿到的是一个 Promise:

window.myascf.send("ui.showToast",{message:"hello from h5"}).then(res=>console.log(res)).catch(err=>console.error(err))

所以我们要设计一套协议,让异步请求和异步响应可以对应起来。

关键就是:requestId

2. 请求协议

H5 发给 ArkTS 的请求长这样:

{"requestId":"req_1700000000000_1","action":"ui.showToast","params":{"message":"hello from h5"}}

字段不多,但每个都很重要。

requestId用来匹配响应。
action表示要调用哪个能力。
params是参数。

如果没有requestId,H5 同时发出两个请求时,就无法知道哪个响应属于哪个请求。

3. H5 侧 send 方法

H5 侧的send大致做这些事:

varcallbacks=newMap()window.myascf={send:function(action,params,options){returnnewPromise(function(resolve,reject){varrequestId=createRequestId()varrequest={requestId:requestId,action:action,params:params||{}}callbacks.set(requestId,{resolve:resolve,reject:reject,action:action,createdAt:Date.now()})window.MyASCFNative.postMessage(JSON.stringify(request))})}}

这里有一个 callback map。

它的作用是保存每一次请求对应的 Promise 回调。

等 ArkTS 回来时,再根据requestId找到它。

4. ArkWeb 注入对象

ArkTS 侧通过 JavaScriptProxy 向 H5 注入一个对象:

Web({src:$rawfile('web/index.html'),controller:this.controller}).javaScriptProxy({object:this.nativeProxy,name:'MyASCFNative',methodList:['postMessage'],controller:this.controller})

H5 侧就可以调用:

window.MyASCFNative.postMessage(JSON.stringify(request))

这里的postMessage是 ArkTS 暴露出来的方法。

5. JavaScriptProxy 只做转发

JavaScriptProxy不应该写业务逻辑。

它只负责把消息交给 BridgeController。

exportclassJavaScriptProxy{constructor(privatebridgeController:BridgeController){}postMessage(message:string):void{this.bridgeController.handleMessage(message)}}

这是一条很重要的边界。

如果在 Proxy 里直接判断 action,那么它很快就会变得混乱。

Proxy 是入口,不是业务层。

6. ArkTS 返回响应

ArkTS 返回给 H5 的响应格式如下:

{"requestId":"req_1700000000000_1","code":0,"message":"success","data":{"echoAction":"ui.showToast"}}

H5 暴露一个全局回调:

window.__myascf_on_native_response__=function(responseText){varresponse=JSON.parse(responseText)varcallback=callbacks.get(response.requestId)if(!callback){console.warn('CALLBACK_LOST',response.requestId)return}callbacks.delete(response.requestId)if(response.code===0){callback.resolve(response)}else{callback.reject(response)}}

ArkTS 通过runJavaScript调用这个函数。

7. 为什么要小心字符串转义

ArkTS 回调 H5 时,本质上是在执行一段 JS 字符串。

比如:

window.__myascf_on_native_response__('{...}')

如果 JSON 里有引号、换行或特殊字符,脚本就可能拼坏。

所以项目里抽出了BridgeCallbackExecutor,统一负责:

  • JSON 序列化;
  • 参数安全转义;
  • 拼接 JS;
  • 执行 runJavaScript;
  • 记录日志。

这样 BridgeController 就不需要关心字符串细节。

8. 这一阶段的意义

到这里,我们还没有实现真正的 Toast。

但是通信边界已经成立了:

H5 Promise → requestId → callback map → JavaScriptProxy → BridgeController → runJavaScript → H5 Promise resolve / reject

这一步很重要。

因为后面的 Dispatcher、Registry、Biz、Imp 都建立在这个边界之上。

项目地址:

https://github.com/lichenyang5/MiniAppRuntime-Harmony
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/10 15:29:28

如何用js-stl优化你的JavaScript应用性能:7个实用技巧

如何用js-stl优化你的JavaScript应用性能:7个实用技巧 【免费下载链接】js-stl Data structures implemented in JS 项目地址: https://gitcode.com/gh_mirrors/js/js-stl JavaScript作为现代Web开发的核心语言,在处理大规模数据时常常面临性能挑…

作者头像 李华
网站建设 2026/7/10 15:28:47

Astroluma故障排除:常见问题与解决方案大全

Astroluma故障排除:常见问题与解决方案大全 【免费下载链接】Astroluma Astroluma is a feature-rich, user-friendly dashboard designed to help you manage multiple aspects of your daily tasks and services. 项目地址: https://gitcode.com/gh_mirrors/as…

作者头像 李华
网站建设 2026/7/10 15:27:49

信息收集方法

第一层&#xff1a;基础指纹识别目标&#xff1a;搞清楚这个网站"是什么"1. 看首页标题 <title> → 知道是哪个单位/公司 ​ 2. 看响应头 Server: Apache / nginx / IIS / VWebServer X-Powered-By: PHP / ASP.NET Set-Cookie: PHPSESSID / JSESSI…

作者头像 李华
网站建设 2026/7/10 15:27:02

2026年度AI论文工具精选:一键生成高质量论文,省心又省力

AI 论文写作工具推荐 你是否还在为撰写期刊论文、毕业论文或职称论文而头疼不已&#xff1f;当你面对浩如烟海的学术文献&#xff0c;感觉就像在大海捞针&#xff0c;繁琐的格式要求让你难以招架&#xff0c;反复的修改又无形中消耗了你的耐心&#xff0c;写作效率低下成为许多…

作者头像 李华
网站建设 2026/7/10 15:24:59

腾讯系资本首次实控A股智能硬件公司,揭示AI物理载体新逻辑

1. 事件本质&#xff1a;不是“马化腾入股”&#xff0c;而是“腾讯系资本平台首次以实控人身份亮相A股” 很多人看到标题第一反应是&#xff1a;“马化腾亲自下场买股票了&#xff1f;”——这是最典型的误读。我做一级市场和上市公司股东结构研究十多年&#xff0c;几乎每天都…

作者头像 李华