Вызов Papa.parse для работника с _config.worker = false вызывает postMessage - PullRequest
0 голосов
/ 30 апреля 2020

Я звоню 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 Я не хочу отправлять результаты в основной поток идея, как мне этого достичь?

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

Они определяют 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>

Теперь, если вам абсолютно необходимо использовать URI blob:, самое простое решение - определить 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>
0 голосов
/ 30 апреля 2020

Кто использует worker-loader в webapck, не используйте встроенный импорт

this.worker = await import(/* webpackChunkName: "MyWorker" */ 'workers/MyWorker') , импортируйте его как BLOB

, импортируйте, используя import MyWorker from 'worker-loader!./MyWorker.js'; это импортирует его как файл и не вызывает проблем.

...