【问题标题】:Call XmlHttpRequest from WebAssembly从 WebAssembly 调用 XmlHttpRequest
【发布时间】:2018-04-15 19:58:47
【问题描述】:

我试图了解从 WebAssembly 调用 XmlHttpRequest 的最佳和最有效的方法。

我找到了http://webassembly.org/getting-started/js-api/,它似乎解释了如何在 JavaScript 和 WebAssembly 之间进行调用。

为了让它发挥作用,在我看来,我必须执行以下操作:

  • 编写一个 JavaScript 函数,将其导入到调用 XmlHttpRequest 的 WebAssembly 中
  • 编写一个从 WebAssembly 导出的 WebAssembly 函数,当 XmlHttpRequest 完成时 JavaScript 调用该函数。

如果我想运行动态数量的并发 XmlHttpRequest,我还需要导入的函数提供一个处理程序,然后由 JavaScript 将其提供回导出的函数。

我现在有几个问题:

  1. 上面的方法准确吗?
  2. 如何将 URI 从 WebAssembly 传输到 XmlHttpRequest?我是否必须在 WebAssembly 中导入或导出 WebAssembler.Memory 对象并将 URI 放入其中?
  3. 如果对 2 的回答是肯定的,则此 WebAssembler.Memory 对象将像一个全局变量,但这可以工作,因为只有一个线程。正确吗?
  4. 类似于 2,如何将 XmlHttpRequest 的结果传回 WebAssembly?也在导入/导出的 WebAssembler.Memory 对象中?
  5. 结合 4,如何以最有效的方式将 XmlHttpRequest 的结果导入 WebAssembly - 例如尽可能少的副本?我是否需要将 XmlHttpRequest 的结果从 JavaScript 代码复制到 WebAssembler.Memory 对象中?再说一遍,这个 WebAssembler.Memory 对象是一个全局变量吗?我想我可以让调用表单 WebAssembly 到 JavaScript 传递一个索引来指示结果应该放在 WebAssember.Memory 中的哪个位置?

【问题讨论】:

    标签: xmlhttprequest webassembly


    【解决方案1】:
    1. 是的,这是正确的。
    2. 您可以将 URI 作为字符串传输,如 this question about strings 中所述
    3. 当 WebAssembly 支持线程时,您可以调用 JavaScript,然后对字符串进行堆分配,传递其指针+长度,然后在调用返回时删除。
    4. 是的,像字符串一样传回来。
    5. 目前您必须进行复制,但社区组正在讨论允许将来减少复制的方法。最新此类讨论的笔记are available from the WebAssembly meetings repository

    【讨论】:

    • 感谢您的回答 - 这非常有用!跟进:从 C 编译时,我知道 JavaScript 和 WebAssembly 之间总是有一个 WebAssembly.Memory 实例共享,这是 C 程序使用的内存。是否可以共享一个额外的 WebAssembly.Memory 实例?从 C 端看会如何?我认为这可能很有用,以便 JavaScript 可以为来自 HttpXmlRequest 的响应分配自己的内存,然后将其传递给 WebAssembly。
    • 目前 WebAssembly 只支持单个内存。有计划在未来提供更多支持。这将取决于工具链以他们认为合适的方式公开它。 LLVM 具有addrspace 的 IR,可以做到这一点,一些语言在 LLVM 中使用它。在 C++ 中,分配器是为类似的东西(分段)而设计的,但必须编写代码才能做到这一点。
    猜你喜欢
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 2019-05-06
    • 2023-03-17
    • 1970-01-01
    • 2020-10-09
    相关资源
    最近更新 更多