generated from gxc-solutions/gxc-template-repo
27 lines
865 B
TypeScript
27 lines
865 B
TypeScript
export class Thread<R, F extends (...args: any[]) => R> {
|
|
private _worker: Worker;
|
|
|
|
constructor(fn: F) {
|
|
const stringFn = `self.onmessage = (event) => {
|
|
const data = event.data;
|
|
const fn = ${fn.toString()};
|
|
const result = fn(...data.data);
|
|
self.postMessage(result);
|
|
}`;
|
|
const jsFile = new File([stringFn], `${fn.name}.js`, { type: "application/javascript" });
|
|
const jsFileUrl = URL.createObjectURL(jsFile);
|
|
this._worker = new Worker(jsFileUrl);
|
|
}
|
|
|
|
public run(...args: Parameters<F>): Promise<R> {
|
|
this._worker.postMessage({ data: [...args] });
|
|
return new Promise<R>((res, rej) => {
|
|
this._worker.addEventListener("message", (event) => res(event.data));
|
|
this._worker.addEventListener("error", (event) => rej(event));
|
|
});
|
|
}
|
|
|
|
public terminate(): void {
|
|
this._worker.terminate();
|
|
}
|
|
}
|