0

我正在调用Papa.parse我自己的工人,并且 in_config.worker设置为假。当过程完成时,它postMessage仍然调用会触发一条消息给我自己的工作人员。不应该

if (IS_PAPA_WORKER)
{
    global.postMessage({
        results: results,
        workerId: Papa.WORKER_ID,
        finished: finishedIncludingPreview
    });
}

还应该检查是否config.worker设置为true然后只调用global.postMessage 我不想将结果发送到主线程任何想法我该如何实现它?

4

2 回答 2

1

他们确实定义IS_PAPA_WORKER

var IS_WORKER = !global.document && !!global.postMessage,
    IS_PAPA_WORKER = IS_WORKER && /blob:/i.test((global.location || {}).protocol);

这意味着他们会检查是否没有document属性、postMessage属性以及当前领域是否已从blob:URI 加载。

在您的情况下,最好的解决方案可能是不从blob:URI 加载脚本,而是使用专用的脚本文件。

const worker = new Worker( '/a_real_file.js' );

这是一个使用data:URI 的演示,因为 StackSnippets 不允许存储文件,但不要data:自己使用 URI,这只是为了演示协议很重要:

const worker_script = document.querySelector( '[type="worker-script"]' ).textContent;
const worker_url = 'data:text/javascript,' + encodeURIComponent( worker_script );
const worker = new Worker( worker_url );
worker.onmessage = ({data}) => console.log( data );
worker.onerror = console.error;
<script type="worker-script">
  importScripts( 'https://cdnjs.cloudflare.com/ajax/libs/PapaParse/5.1.0/papaparse.min.js' );
  
  const csv = `col1,col2,col3
a,1,z
b,2,y
c,3,x`;
  Papa.parse( csv, { header: true } );
  postMessage( 'worker done' );
</script>

现在,如果您绝对需要使用blob:URI,最简单的解决方案是 document在导入库之前定义为真实的全局属性:

const worker_script = document.querySelector('[type="worker-script"]').textContent;
const worker_url = URL.createObjectURL( new Blob( [ worker_script ], { type: 'text/javascript' } ) );
const worker = new Worker( worker_url );
worker.onmessage = ({data}) => console.log( data );
<script type="worker-script">
  self.document = {};
  importScripts( 'https://cdnjs.cloudflare.com/ajax/libs/PapaParse/5.1.0/papaparse.min.js' );
  
  const csv = `col1,col2,col3
a,1,z
b,2,y
c,3,x`;
  Papa.parse( csv, { header: true } );
  postMessage( 'worker done' );
</script>

于 2020-04-30T03:04:59.907 回答
0

谁在使用worker-loader不要webapck使用内联导入

this.worker = await import(/* webpackChunkName: "MyWorker" */ 'workers/MyWorker') 这将其导入为 BLOB

使用import MyWorker from 'worker-loader!./MyWorker.js';此导入它作为文件导入,不会引起问题。

于 2020-04-30T11:27:07.750 回答