Javascript Wasm:Uncaught(在承诺中)类型错误:导入“0模块=”;环境";错误:模块不是对象或函数承诺。然后(异步)(匿名)@(索引):9

Javascript Wasm:Uncaught(在承诺中)类型错误:导入“0模块=”;环境";错误:模块不是对象或函数承诺。然后(异步)(匿名)@(索引):9,javascript,c,emscripten,webassembly,Javascript,C,Emscripten,Webassembly,我是emscripten的新手,觉得很难。。。我有义务在windows上工作,因为我必须测试应用程序的.exe版本。我在Windows7上 我可以编译wasm,但javascript无法读取它。这是我的密码 C代码: char * HelloWorld () { return "Hello World !"; } Emscripten命令行: emcc hello.c -O2 -s ONLY_MY_CODE=1 -s WASM=1 -s SIDE_MODULE=1 -s EXPORTE

我是emscripten的新手,觉得很难。。。我有义务在windows上工作,因为我必须测试应用程序的.exe版本。我在Windows7上

我可以编译wasm,但javascript无法读取它。这是我的密码

C代码:

char * HelloWorld ()
{
    return "Hello World !";
}
Emscripten命令行:

emcc hello.c -O2 -s ONLY_MY_CODE=1 -s WASM=1 -s SIDE_MODULE=1 -s EXPORTED_FUNCTIONS="['_HelloWorld']" -o hello.wasm
Wat结果:

(module
  (type $t0 (func (result i32)))
  (type $t1 (func))
  (import "env" "memory" (memory $env.memory 256))
  (import "env" "memoryBase" (global $env.memoryBase i32))
  (func $_HelloWorld (export "_HelloWorld") (type $t0) (result i32)
    (get_global $env.memoryBase))
  (func $__post_instantiate (export "__post_instantiate") (type $t1)
    (set_global $g1
      (i32.add
        (get_global $env.memoryBase)
        (i32.const 16)))
    (set_global $g2
      (i32.add
        (get_global $g1)
        (i32.const 5242880))))
  (global $g1 (mut i32) (i32.const 0))
  (global $g2 (mut i32) (i32.const 0))
  (data (get_global $env.memoryBase) "Hello World !"))
Javascript:

importObject = {};

fetch('hello.wasm').then(response =>
  response.arrayBuffer()
).then(bytes =>
  WebAssembly.instantiate(bytes, importObject)
).then(results => {
  console.log("loaded");
});
错误消息:

Uncaught (in promise) TypeError: Import #0 module="env" error: module is not an object or function
Promise.then (async)
(anonymous) @ (index):9

你能告诉我我的代码出了什么问题吗?

我认为挑战在于:WebAssembly还没有完全成熟

这些示例显示了它们的加载程序看起来像NPM包。在该包中,importObj是可选的

您和我正在尝试使用WebAssembly.instantiate()-我正在使用一个web工作者

因此,我们需要传递一个更完整的导入,特别是带有中止方法的env。以下是的assemblyscript初学者项目的一个示例:

main.html


main.js

WebAssembly.instantiateStreaming(fetch("../out/main.wasm"), {
  main: {
    sayHello() {
      console.log("Hello from WebAssembly!");
    }
  },
  env: {
    abort(_msg, _file, line, column) {
      console.error("abort called at main.ts:" + line + ":" + column);
    }
  },
}).then(result => {
  const exports = result.instance.exports;
  document.getElementById("container").textContent = "Result: " + exports.add(19, 23);
}).catch(console.error);
梅因酒店

声明函数sayHello():void;
你好;
导出函数添加(x:i32,y:i32):i32{
返回x+y;
}

注意importObject中的env.abort函数(与C和emscripten相关的问题)我猜这个问题不再是实际问题,因为它的年龄搜索该错误带来了本文。此错误与尝试使用带有WebAssembly浏览器实例化的AssemblyScript加载程序示例时相同。问题不是C/emscripten,它没有正确填写importObj。如果有更多的例子可以借鉴,那将非常有帮助。