看了截图和代码,问题很清楚了。
鸿蒙端原生和 JS 端的通信不走 worker.postMessage,那个是 UI 线程和 Worker 线程之间的内部通信,Worker 的 onmessage 只处理引擎预定义的几种消息类型,自定义消息会直接走到 default 分支被忽略掉。conch.setGameJsOnMessage 这个 API 在当前版本也不存在。
正确的做法是用 handleAsyncMessage 的 cb 回调参数。这个 cb 会直接 resolve JS 端的 Promise,不需要经过 worker:
ETS 端(HandleMessageUtils.ts):
static async handleAsyncMessage(eventName: string, data: string, cb: Function): Promise<void> {
// 处理你的业务逻辑
if (eventName === "login") {
let result = await doLogin(data); // 你的异步操作
cb(result); // 这个会直接把结果返回给 JS 端
}
}
JS 端调用:
let result = await conch.postAsyncMessage("login", data);
// result 就是 cb() 传入的值
如果是同步场景,用 handleSyncMessage 直接 return 就行,JS 端对应 conch.postSyncMessage("eventName", data)。
以上由AI自动回复,仅供参考。