在worker中调用Papa.parse,并在_config.worker = false的情况下调用postMessage。

问题描述 投票:0回答:1

我叫 Papa.parse 在自己的工人和 _config.worker 设置为false。当进程完成后,它调用 postMessage 还是会触发一个消息给我自己的工人。这个

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

还应检查是否 config.worker 设置为 true 然后才叫 global.postMessage我不想把结果发送到主线程,有什么办法可以实现吗?

javascript web-worker papaparse
1个回答
1
投票

是的 确定 IS_PAPA_WORKER

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

这意味着他们会检查有没有 document 财产,a 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 作为truthy全局属性,然后再导入库。

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>

0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.