1 Star 0 Fork 0

Sterne Lee / example-worker

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
DynamicWorker.js 1.83 KB
一键复制 编辑 原始数据 按行查看 历史
李兴广 提交于 2020-07-06 11:29 . 增加文件读取
class DynamicWorker {
constructor(fn) {
this.flagMapping = {};
const handleResult = ({ data: { flag, data } }) => {
const { resolve, reject } = this.flagMapping[flag];
if (resolve) {
resolve(data);
delete this.flagMapping[flag];
}
if (reject) {
reject(data);
delete this.flagMapping[flag];
}
};
const onMessageHandlerFn = `
const __fn = ${fn};
console.log(__fn);
self.onmessage = e => {
const { flag, method, args } = e.data;
console.log(flag, method, args);
const data = __fn[method] && __fn[method](...args) || null;
console.log('data', data);
self.postMessage({flag, data});
};
`;
const blob = new Blob([onMessageHandlerFn], {
type: "application/javascript",
});
this.worker = new Worker(URL.createObjectURL(blob));
// this.worker = new Worker(
// "data:text/javascript," +
// encodeURIComponent(`
// 'use strict';
// const __fn = ${fn};
// console.log(__fn);
// self.onmessage = e => {
// const { flag, method, args } = e.data;
// console.log(flag, method, args);
// const data = __fn[method] && __fn[method](...args) || null;
// self.postMessage({flag, data});
// };
// `)
// );
this.worker.addEventListener("message", handleResult);
this.worker.addEventListener("error", handleResult);
URL.revokeObjectURL(blob);
}
dispatch(method, ...args) {
const flag = `${new Date().getTime()}${parseInt(Math.random() * 1000)}`; // uuid
this.worker.postMessage({
flag,
method,
args,
});
return new Promise((resolve, reject) => {
this.flagMapping[flag] = { resolve, reject };
});
}
close() {
this.worker.terminate();
}
}
export default DynamicWorker;
TypeScript
1
https://gitee.com/sternelee/example-worker.git
git@gitee.com:sternelee/example-worker.git
sternelee
example-worker
example-worker
master

搜索帮助