WebAssembly 能得到 javascript 回调吗?

Can WebAssembly get javascript callback?

是否可以将 javascript 回调传递给 WebAssembly? 我们可以从 WebAssembly 触发事件并在 javascript 中收听吗?

我从 Kevin Hoffman 那里找到了这个 article 尝试使用 rust。

归结为使用 WebAssembly.instantiate(bufferSource, importObject) 可选 importObject。您可以在 MDN.

上阅读更多相关信息

这是文章的例子

网络客户端

<html>
 <head>
  <script>

   function logit() {
     console.log('this was invoked by Rust, written in JS');
   }

   let imports = {logit};

   fetch('wasm_project.gc.wasm')
     .then(r => r.arrayBuffer() )
     .then(r => WebAssembly.instantiate(r, { env: imports }))
     .then(wasm_module => {
       alert(`2 + 1 = ${wasm_module.instance.exports.add_one(2)}`);
     });
   </script>

 </head>
 <body></body>
</html>

Rust 原型

extern "C" {
   fn logit();
}

生锈

#[no_mangle]
pub extern fn add_one(a: u32) -> u32 {
    logit();
    a + 1
}

信用

所有功劳都归功于凯文霍夫曼 Article

可以,但是您必须使用 Webassembly 端的函数 table。它的作用只是通过 table 中的索引引用函数,并使用 call_indirect.
通过动态索引调用它们 注意: table 是webassembly的一个核心东西,但我不知道它在WebAssembly-Text(wat)以外的其他语言中是如何实现的。 call_indirect 是二进制指令的名称