Javascript 使用Vue.Js在Web工作人员中正确启动函数
我正试图使用将处理选定输入文件的任务卸载到base64,卸载到后台线程。但是我没有成功。以下是我正在尝试的:Javascript 使用Vue.Js在Web工作人员中正确启动函数,javascript,vue.js,web-worker,Javascript,Vue.js,Web Worker,我正试图使用将处理选定输入文件的任务卸载到base64,卸载到后台线程。但是我没有成功。以下是我正在尝试的: // file is selected file from input const getBase64 = (file) => { return new Promise((resolve, reject) => { const reader = new FileReader() reader.readAsDataURL(file) re
// file is selected file from input
const getBase64 = (file) => {
return new Promise((resolve, reject) => {
const reader = new FileReader()
reader.readAsDataURL(file)
reader.onload = () => resolve(reader.result)
reader.onerror = error => reject(error)
})
}
this.$worker.run((file, getBase64) => {
getBase64(file).then((data) => {
return data
})
}, [file, getBase64])
.then(result => {
console.log(result)
})
.catch(e => {
console.error(e)
})
但是,我得到以下错误:
DomeException:未能对“Worker”执行“postMessage”:函数
getBase64(文件){返回新承诺(函数(解析、拒绝){
无法克隆var reader=new FileReader();…}
这个错误到底与什么有关?我正在尝试实现的是可能的吗?我没有使用
vue worker
,因此这不是一个确切的答案,但我希望它仍能在某些方面帮助您
我是这样使用的:
worker脚本-calc.worker.js
import regress from '@/lib/regression'
// Setup an event listener that will handle messages sent to the worker.
self.addEventListener('message', function(e)
{
if(e.data && e.data.cmd) switch(e.data.cmd)
{
case 1: // regression of combined data
setTimeout(function()
{
combined(e.data);
},20);
break;
case 2: // regressions of individual campaigns
setTimeout(function()
{
individual(e.data);
},20);
break;
}
}, false);
function combined(data)
{
do_regress(data.regression,data.param,data.outliers);
self.postMessage(data);
}
function individual(data)
{
let i;
for(i=0;i<data.param.length;i++)
do_regress(data.regression,data.param[i],data.outliers);
self.postMessage(data);
}
在$worker.run中,您不能返回getBase64函数或任何东西
<script>
import CalcWorker from '@/calc.worker.js'
export default
{
data()
{
return {
worker: new CalcWorker(),
individual: 0,
kind: 1,
regression: [],
outliers: []
}
},
created()
{
// Setup an event listener that will handle messages received from the worker.
this.worker.addEventListener('message', this.worker_ready, false);
this.update();
},
beforeDestroy: function()
{
this.worker.terminate();
},
methods:
{
update()
{
this.worker.postMessage(
{
cmd: 2,
param: this.individual,
kind: this.kind,
regression: this.regression,
outliers: this.outliers
});
},
worker_ready(e)
{
switch(e.data.cmd)
{
case 1:
......
break;
case 2:
......
break;
}
}
}
}
</script>