[英]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.