簡體   English   中英

JavaScript:是否可以在 web 工作人員中使用生成器功能?

[英]JavaScript: Is it possible to use generator functions in web workers?

我想 stream 一些數據從 web 工作人員到父進程。 我試圖這樣做使用:

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”並從 function 聲明中刪除星號會使錯誤 go 消失(但它當然會阻止將結果流式傳輸到父進程)。

有誰知道如何在 web 工人中使用發電機? 其他人可以就這個問題提供的任何指示將不勝感激!

使用sef.process()調用生成器會返回一個迭代器,它具有下一個 function。 下一個 function 不能被送回主代理並在那里調用,這會破壞代理的分離,所以這根本不能做。 您必須在工作人員中使用迭代器,並且只發送帶有消息的結果。

  // 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;
  };

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM