使用 _config.worker = false 在 worker 中调用 Papa.parse 调用 postMessage
Calling Papa.parse in worker with _config.worker = false calls postMessage
我在我自己的 worker 中调用 Papa.parse
,在 _config.worker
中设置为 false。
当进程完成时,它仍然调用 postMessage
触发一条消息给我自己的工人。
不应该 this
if (IS_PAPA_WORKER)
{
global.postMessage({
results: results,
workerId: Papa.WORKER_ID,
finished: finishedIncludingPreview
});
}
还应检查 config.worker
是否设置为 true
然后仅调用 global.postMessage
我不想将结果发送到主线程,不知道如何实现它?
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>
谁在 webapck
中使用 worker-loader
不要使用内联导入
this.worker = await import(/* webpackChunkName: "MyWorker" */ 'workers/MyWorker')
this import it as BLOB
使用 import MyWorker from 'worker-loader!./MyWorker.js';
导入它,这会将其作为文件导入,不会引起问题。
我在我自己的 worker 中调用 Papa.parse
,在 _config.worker
中设置为 false。
当进程完成时,它仍然调用 postMessage
触发一条消息给我自己的工人。
不应该 this
if (IS_PAPA_WORKER)
{
global.postMessage({
results: results,
workerId: Papa.WORKER_ID,
finished: finishedIncludingPreview
});
}
还应检查 config.worker
是否设置为 true
然后仅调用 global.postMessage
我不想将结果发送到主线程,不知道如何实现它?
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>
谁在 webapck
中使用 worker-loader
不要使用内联导入
this.worker = await import(/* webpackChunkName: "MyWorker" */ 'workers/MyWorker')
this import it as BLOB
使用 import MyWorker from 'worker-loader!./MyWorker.js';
导入它,这会将其作为文件导入,不会引起问题。