Javascript 使用Vue.Js在Web工作人员中正确启动函数

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

我正试图使用将处理选定输入文件的任务卸载到base64,卸载到后台线程。但是我没有成功。以下是我正在尝试的:

 // 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>