从 JavaScript 终止 WebAssembly

Posted

技术标签:

【中文标题】从 JavaScript 终止 WebAssembly【英文标题】:Terminate WebAssembly from JavaScript 【发布时间】:2018-01-01 11:15:16 【问题描述】:

是否可以终止正在运行的 WebAssembly 代码并从 javascript 中清除任何剩余资源?

一般情况是这样的。 JS 初始化一个 WASM 模块并调用一个导出的函数。稍后,WASM 代码调用导入的函数f 将控制权转回给 JS。 f 做了一些事情,并根据结果决定是否保持 WASM 运行。

两种情况:

WASM 应该保持运行。 f 直接返回。 f 决定终止 WASM 功能并可能清理任何与 WASM 相关的资源。它可以?怎么样?

如果可以更轻松地分析更具体的示例,请考虑 execve 的工作原理。如果调用失败,它只会返回指示失败。但是,如果它成功了,它就不会返回 - 一个广泛的过度简化是说它终止调用者并在它的位置开始一个新的调用者(保持一些环境不变)。

【问题讨论】:

你不能简单地使用杀戮标志吗? Afaik,您可以写入 wasm 内存,因此 js 程序可以设置 wasm 程序定期检查的标志 @JonasW。理想情况下,我想避免这种情况。我宁愿 WASM 模块不需要知道或有任何专门为此工作的东西。 【参考方案1】:

可能终止调用者的唯一方法——无论调用者是 Wasm 还是 JavaScript——是抛出异常。这让调用者做出充分反应。特别是,如果它需要进行清理,那么它应该被编写成捕获可能的异常、执行清理并重新抛出(或者,等效地,在可用时使用 try-finally 构造)。

Wasm 目前不直接支持异常处理,但可以通过 thunking 到 JavaScript 来模拟。 Wasm 的未来版本将提供适当的异常处理支持。

【讨论】:

哦,投掷会终止wasm,但不会终止js端。很简单。谢谢!

以上是关于从 JavaScript 终止 WebAssembly的主要内容,如果未能解决你的问题,请参考以下文章

如何阻止、停止或终止 Javascript 函数?

JavaScript学习之DOM高级操作(动画)

如何终止 JavaScript 中的脚本?

Javascript未终止的字符串文字错误

应用程序终止时运行 javascript

javascript中的Websockets,页面刷新或导航到其他页面时连接终止[重复]