JavaScript: Возможно ли использовать функции генератора в веб-работниках? - PullRequest
0 голосов
/ 27 апреля 2020

Я хотел бы передать некоторые данные от веб-работника родительскому процессу. Я пытался сделать это, используя:

var s = `
  self.onmessage = function(event) {
    postMessage(self.process(event.data))
  };
  self.process = function* (n) {
    for (var i=0; i<n; i++) yield i;
  }
`
var blob = new Blob([s], {type: 'application/javascript'});
var worker = new Worker(URL.createObjectURL(blob));

worker.onmessage = e => {console.log('got back', e.data)}
worker.postMessage(7);

Но это бросает Uncaught DOMException: Failed to execute 'postMessage' on 'DedicatedWorkerGlobalScope': [object Generator] could not be cloned.. Замена «yield» на «return» и удаление звезды из объявления функции устраняет ошибку go (но, конечно, она не позволяет передавать результаты в родительский процесс).

Кто-нибудь знает, как это сделать? можно использовать генераторы в веб-работниках? Будем весьма благодарны за любые подсказки, которые другие могут предложить по этому вопросу!

1 Ответ

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

Вызов генератора с sef.process() возвращает итератор, у которого есть следующая функция. Эта следующая функция не может быть отправлена ​​обратно главному агенту и вызвана там, что нарушит разделение агентов, поэтому это вообще нельзя сделать. Вы должны использовать итератор на рабочем месте и отправлять результаты только с сообщениями.

  // In the worker: Consume the iterator:

  self.onmessage = function(event) {
     const it = self.process(event.data); // this contains a function, so it has to stay here
     let result;
     do { 
        postMessage(result = it.next());  // but the iteration objects can be sent, they onyl contain a number and a boolean
      } while(!result.done);         
  };

  self.process = function* (n) {
    for (var i=0; i<n; i++) yield i;
  };
...