gpt4 book ai didi

javascript - 在worker.addEventListener中发送另一个postMessage

转载 作者:行者123 更新时间:2023-12-01 04:01:18 27 4
gpt4 key购买 nike

主要问题:从 worker.addEventListener 调用 worker.postMessage 不好吗?下面的示例,我尝试使其尽可能短。

我有一个带有工作器的 GWT native 函数(工作器之前已初始化,因此我可以重用它。另外,大括号应该是 /*-{}-*/ 但为了语法突出显示,我只使用 {})。

private native void nativeWorkerCalls(JavaScriptObject worker, int cwidth, int cheight) {
console.log('Main: Pre draw');
worker.postMessage({'cmd' : 'draw', 'args' : [cwidth*cheight] });

worker.addEventListener('message', function(e) {
switch (e.data.cmd) {
case 'draw':
/* do some stuff */
console.log('Main: Pre clear');
worker.postMessage({'cmd' : 'clearBuffer', 'args' : [e.data.offset]}); // I call the worker again!
break;
case 'clearBuffer':
console.log("%c Main: Post clear", 'background: #222; color: #00ffae');
break;
default:
break;
};
console.log("Main: ### Finished listener ###");
}, false);
};

以及以下 worker.js 脚本,该脚本应根据传递的“cmd”执行不同的开关情况。

importScripts("emscripten.js");

self.addEventListener('message', function(e) {
var data = e.data;
switch (data.cmd) {
case 'draw':
/* assign some buffer, draw into it */
self.postMessage({ 'cmd' : 'draw', buffer : mb, offset : buffer});
break;
case 'clearBuffer':
/* clear buffer */
console.log('Main: Pre clear');
self.postMessage({'cmd' : 'clearBuffer'});
break;
default:
self.postMessage(null);
};
}, false);

问题:我第一次运行 native 函数时一切正常。但是接下来的每个调用都会产生副作用,即worker.js 中的事件监听器会被重复调用。

一次运行应进行以下调用:

Main: Pre draw

Worker: Draw

Main: Post draw

Main: Pre clear

Main: ### Finished listener ###

Worker: Free buffer

Main: Post clear

Main: ### Finished listener ###

第二次按下按钮会给我太多的调用 - 它添加了另一个绘制(这似乎没有做任何事情),并且还添加了另一个清除(这会遇到错误,因为工作人员将尝试释放缓冲区已经被释放):

Main: Pre draw

Worker: Draw

Main: Post draw

Main: Pre clear

Main: ### Finished listener ###

Main: Post draw

Main: Pre clear

Main: ### Finished listener ###

Worker: Free buffer

Main: Post clear

Main: ### Finished listener ###

Main: Post clear

Main: ### Finished listener ###

Worker: Free buffer

最佳答案

是的,这很糟糕,任何消息传递系统中的三向往返都是一种反模式,除了协议(protocol)发现之类的东西。

为了避免这种情况,请将您的状态集中在主线程中,并立即发送包括派生数据在内的所有数据。

关于javascript - 在worker.addEventListener中发送另一个postMessage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42163927/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com