Javascript web worker使用web程序集时出错

Javascript web worker使用web程序集时出错,javascript,c,emscripten,webassembly,Javascript,C,Emscripten,Webassembly,我想在web worker中使用WebAssembly 在我的主应用程序中,我按如下方式启动它: let w = new Worker('test.js'); w.onmessage = (event) => { console.log(event); }; w.onerror = (event) => { console.error(event); }; w.postMessage({ message: "Hello World" }); 然后,我创建了一个文件test.js,如

我想在web worker中使用WebAssembly

在我的主应用程序中,我按如下方式启动它:

let w = new Worker('test.js');
w.onmessage = (event) => { console.log(event); };
w.onerror = (event) => { console.error(event); };
w.postMessage({ message: "Hello World" });
然后,我创建了一个文件
test.js
,如下所示:

self.Module = {
    locateFile: function (s) {
        console.log(s);
        return s;
    }
};

self.importScripts("main.js"); 
// note: `main.js` is the JavaScript glue file created by emcc

self.onmessage = function(messageEvent) {
    console.log(messageEvent); // works!
    console.log(self.Module); // works!
    console.log(self.Module.ccall("test")); // crashes!
}
我收到一个错误:
未捕获类型错误:无法读取未定义的属性“apply”
。我不明白为什么
self.Module
没有定义,这怎么可能

我感觉web worker和WebAssembly的范围有些地方不能很好地协同工作


谢谢你的意见

问题在于console.log()没有显示对象在执行时的真实状态。进一步挖掘发现,实际上,对象
模块
尚未准备就绪

我引述:

如何判断页面何时已完全加载,调用编译后的函数是否安全?

在页面完全加载之前调用已编译函数可能会导致 在错误中,如果函数依赖可能不存在的文件

[……]

另一个选项是定义 onRuntimeInitialized函数:
Module['onRuntimeInitialized']=function(){…}

当运行时准备就绪并且您可以调用编译后的代码时,将调用该方法

调整my
test.js
(worker)文件修复了以下问题:

self.Module = {
    locateFile: function (s) {
        console.log(s);
        return s;
    }
    // Add this function
    onRuntimeInitialized: function() {
        test();
    }
};

self.importScripts("main.js"); 
// note: `main.js` is the JavaScript glue file created by emcc

self.data = {};

// to pass data from the main JS file
self.onmessage = function(messageEvent) {
    console.log(messageEvent); // works!
    self.data = messageEvent; // save the data
}

// gets executed when everything is ready.
self.test = function() {
    // we may safely use self.data and self.Module now!
    console.log(self.Module.ccall("test")); // works!
}