cocos-engine
cocos-engine copied to clipboard
Need worker port export in harmony os and better functions to call thread
Use Case
it's too hard to call worker port in ark TS and add new statement.
Problem Description
too hard to use in cocos worker, this file will be rebuild everytime
Proposed Solution
some suggestion like, to use map to add new statement // 消息处理器映射表 const messageHandlers = new Map(); /**
- 消息处理器类型定义 */ type MessageHandler = (param: any) => void;
/**
- WorkerPort 接口定义
/
export interface IWorkerPort {
/*
- 原始 workerPort 引用 */ port: any; // 使用 worker.WorkerPort 类型,如果有定义的话
/**
- 注册消息处理器
- @param messageName 消息名称
- @param handler 处理函数
- @returns this 支持链式调用 */ on(messageName: string, handler: MessageHandler): IWorkerPort;
/**
- 移除消息处理器
- @param messageName 消息名称
- @returns this 支持链式调用 */ off(messageName: string): IWorkerPort;
/**
- 处理消息
- @param messageName 消息名称
- @param param 消息参数
- @returns boolean 是否成功处理 */ processMessage(messageName: string, param: any): boolean;
/**
- 转发原始 postMessage 方法
- @param message 消息内容 */ postMessage(message: any): void;
/**
- 注册消息处理器,当接收到指定消息时调用Cocos函数
- @param messageName 消息名称
- @param functionName Cocos环境中的函数名
- @param params 要传递给函数的参数(可选)
- @returns this 支持链式调用 */ evalString(messageName: string, functionName: string): IWorkerPort; }
export const WorkerPort: IWorkerPort = { /**
- 原始 workerPort 引用 */ port: worker.workerPort,
/**
- 注册消息处理器
- @param messageName 消息名称
- @param handler 处理函数
- @returns this 支持链式调用 */ on(messageName: string, handler: MessageHandler): IWorkerPort { messageHandlers.set(messageName, handler); return this; },
/**
- 移除消息处理器
- @param messageName 消息名称
- @returns this 支持链式调用 */ off(messageName: string): IWorkerPort { messageHandlers.delete(messageName); return this; },
/**
- 处理消息
- @param messageName 消息名称
- @param param 消息参数
- @returns boolean 是否成功处理 */ processMessage(messageName: string, param: any): boolean { if (messageHandlers.has(messageName)) { const handler = messageHandlers.get(messageName); handler(param); return true; } return false; },
/**
- 转发原始 postMessage 方法
- @param message 消息内容 / postMessage(message: any): void { worker.workerPort.postMessage(message); }, /*
- 注册消息处理器,当接收到指定消息时调用Cocos函数
- @param messageName 消息名称
- @param functionName Cocos环境中的函数名
- @param params 要传递给函数的参数(可选)
- @returns this 支持链式调用
*/
evalString(messageName: string, functionName: string): IWorkerPort {
this.on(messageName, (params) => {
// 如果提供了固定参数,则使用固定参数
const jsCode =
${functionName}('${params}'); cocos.evalString(jsCode); }); return this; },
};
How it works
No response
Alternatives Considered
some suggestion like, to use map to add new statement // 消息处理器映射表 const messageHandlers = new Map(); /**
- 消息处理器类型定义 */ type MessageHandler = (param: any) => void;
/**
- WorkerPort 接口定义
/
export interface IWorkerPort {
/*
- 原始 workerPort 引用 */ port: any; // 使用 worker.WorkerPort 类型,如果有定义的话
/**
- 注册消息处理器
- @param messageName 消息名称
- @param handler 处理函数
- @returns this 支持链式调用 */ on(messageName: string, handler: MessageHandler): IWorkerPort;
/**
- 移除消息处理器
- @param messageName 消息名称
- @returns this 支持链式调用 */ off(messageName: string): IWorkerPort;
/**
- 处理消息
- @param messageName 消息名称
- @param param 消息参数
- @returns boolean 是否成功处理 */ processMessage(messageName: string, param: any): boolean;
/**
- 转发原始 postMessage 方法
- @param message 消息内容 */ postMessage(message: any): void;
/**
- 注册消息处理器,当接收到指定消息时调用Cocos函数
- @param messageName 消息名称
- @param functionName Cocos环境中的函数名
- @param params 要传递给函数的参数(可选)
- @returns this 支持链式调用 */ evalString(messageName: string, functionName: string): IWorkerPort; }
export const WorkerPort: IWorkerPort = { /**
- 原始 workerPort 引用 */ port: worker.workerPort,
/**
- 注册消息处理器
- @param messageName 消息名称
- @param handler 处理函数
- @returns this 支持链式调用 */ on(messageName: string, handler: MessageHandler): IWorkerPort { messageHandlers.set(messageName, handler); return this; },
/**
- 移除消息处理器
- @param messageName 消息名称
- @returns this 支持链式调用 */ off(messageName: string): IWorkerPort { messageHandlers.delete(messageName); return this; },
/**
- 处理消息
- @param messageName 消息名称
- @param param 消息参数
- @returns boolean 是否成功处理 */ processMessage(messageName: string, param: any): boolean { if (messageHandlers.has(messageName)) { const handler = messageHandlers.get(messageName); handler(param); return true; } return false; },
/**
- 转发原始 postMessage 方法
- @param message 消息内容 / postMessage(message: any): void { worker.workerPort.postMessage(message); }, /*
- 注册消息处理器,当接收到指定消息时调用Cocos函数
- @param messageName 消息名称
- @param functionName Cocos环境中的函数名
- @param params 要传递给函数的参数(可选)
- @returns this 支持链式调用
*/
evalString(messageName: string, functionName: string): IWorkerPort {
this.on(messageName, (params) => {
// 如果提供了固定参数,则使用固定参数
const jsCode =
${functionName}('${params}'); cocos.evalString(jsCode); }); return this; },
};
Additional Information
No response
https://github.com/cocos/cocos-engine/pull/18743