新增worker辅助类
This commit is contained in:
45
source/src/ECS/Utils/WorkerUtils.ts
Normal file
45
source/src/ECS/Utils/WorkerUtils.ts
Normal file
@@ -0,0 +1,45 @@
|
||||
module es {
|
||||
/**
|
||||
* 开辟一个新线程
|
||||
* 注意:它无法获得主线程中的上下文
|
||||
*/
|
||||
export class WorkerUtils {
|
||||
/** 正在执行的队列 */
|
||||
private static readonly pendingJobs = {};
|
||||
private static jobIdGen = 0;
|
||||
|
||||
/**
|
||||
* 创建一个worker
|
||||
* @param doFunc worker所能做的事情
|
||||
*
|
||||
* @example const worker = es.WorkerUtils.makeWorker(()=>{
|
||||
* onmessage = ({data: {jobId, meesage}}) => {
|
||||
* // worker内做的事
|
||||
* console.log('我是线程', message, jobId);
|
||||
* };
|
||||
* });
|
||||
*
|
||||
* worker('主线程发送消息').then(message => {
|
||||
* console.log('主线程收到消息', message);
|
||||
* });
|
||||
*/
|
||||
public static makeWorker(doFunc: Function) {
|
||||
const worker = new Worker(URL.createObjectURL(new Blob([`(${doFunc.toString()})()`])));
|
||||
|
||||
worker.onmessage = ({ data: { result, jobId } }) => {
|
||||
if (typeof this.pendingJobs[jobId] == 'function')
|
||||
this.pendingJobs[jobId](result);
|
||||
|
||||
delete this.pendingJobs[jobId];
|
||||
};
|
||||
|
||||
return (...message: any[]) => {
|
||||
return new Promise(resolve => {
|
||||
const jobId = this.jobIdGen++;
|
||||
this.pendingJobs[jobId] = resolve;
|
||||
worker.postMessage({ jobId, message });
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user