Worker 这个东西是不是有BUG。

为此折腾了一晚上了,如果是BUG,请问怎么修复,如果不是的话。麻烦告知一声

      我需要跑一个AI

new Worker(aiPath);
我获取了路径"./preview-scripts/assets/Script/XXX.js
然后跑

try catch没有出现异常

在谷歌浏览器上报告CC_EDITOR 没有定义
查看报错文件,发现内部添加了部分的内容
也许是底层的内容。现在请问怎么处理这个

Uncaught ReferenceError: CC_EDITOR is not defined

Worker线程不能访问全局变量和函数。

怎么操作的?worker 加载引擎了吗?啥都不说清楚

嗯,CC_EDITOR 就是一个全局变量
不清楚cocoscreator 的web worker 怎么使用的。

或者说,我希望使用到异步的内容
我的AI很慢,需要时间

就想简单的使用

没有简单的例子。不过我估计是你的 worker 没加载引擎。

要怎么加载引擎呢

worker 启动时不是要传入一个脚本吗?这个脚本应该是引擎之类的,或者带有引擎

确实,我传入了一个脚本,但是打包之后的脚本,被添加了部分内容。里面有全局变量,直接执行失败

能不能有其他联系方式,我想反映一下这个问题,我在找其他方式解决这个问题,但是有机会我还是希望使用 web worker

推荐在论坛反馈,这样大家才能搜索得到。web worker 中使用 creator 我也没尝试过,你自己研究下吧。估计可行性不高,因为 web worker 无法操作 dom。

Worker跟creator没毛线关系,
你把它当成一个黑盒子,里面的东西跟你外面的代码是完全隔绝的,只是通过消息传递参数和结果。
盒子里的所有变量跟外边没关系。

2赞

你的道理我都懂,可以我发现代码被加入了全局变量的判断

那你定义好全局变量啊

用Blob动态生成Worker示例:

function workerThread() {
  self.onmessage = function(e) {
    setTimeout(function() {
      self.postMessage('Received from main: ' + e.data);
    }, 1000);
  };
}
var blob = new Blob([workerThread.toString() + ";workerThread();"],{type:"text/javascript"});
var worker = new Worker(window.URL.createObjectURL(blob));
worker.onmessage=function(e){console.log("Received from worker: " + e.data);};
worker.postMessage("Hello");

把你的计算函数放到workerThread里即可,这样不受Creator打包的影响。

5赞

谢谢你,爱你一万年

这种方法,用来处理一些东西非常好用,但是worker的域却是比较蛋疼的。
比如说,如果出现了需要require的内容

这样就能访问全局变量了?

不能呀,他本来也不想访问全局变量,只是他的做法是把Creator编译后的某个js(http://localhost:7456/preview-scripts/assets/Script/*.js)放到Worker里运行(因为Worker只能运行.js文件不能运行一个函数或类),这个编译后的js包含一些Creator的全局变量(是Creator打包时加的,他不需要的,他只想要js脚本里的计算函数),但Worker里访问不到全局变量,就报错了。我这样就是把他的计算函数通过字符串发到Worker里运行,不受Creator打包影响。全局变量可以通过主线程postMessage到Worker线程。