主要观点:
- JavaScript Promise Integration (JSPI) API 可让假设同步访问外部功能的 WebAssembly 应用在实际异步的环境中平稳运行。
- JSPI 通过拦截异步 Web API 函数返回的
Promise对象并暂停 WebAssembly 应用,当异步 I/O 操作完成时恢复应用,从而弥合同步应用和异步 Web API 之间的差距。 - JSPI 只需对 WebAssembly 应用本身进行很少的更改,且预期使用成本不高,与其他基于转换的方法相比更优。
- JSPI 目前处于 W3C WebAssembly WG 的第 4 阶段,已在 Chrome 137 和 Firefox 139 中可用。
关键信息:
- 异步 API 通过分离操作的启动和解析来工作,应用在启动操作后继续执行,然后在操作完成时得到通知。
- JSPI 在 WebAssembly 模块实例化阶段包装导入和导出,添加暂停行为并将暂停路由到
Promise对象回调。 - 示例展示了如何使用 JSPI 计算斐波那契数列、动态加载代码等,包括相关的 C 代码和 Emscripten 编译命令等。
重要细节:
fetchAPI 是异步的,返回Promise对象,通过附加回调来处理响应。- C/C++应用通常基于同步 API 编写,而浏览器主线程不允许阻塞,许多环境也不支持同步编程,JSPI 解决了这一矛盾。
- JSPI 工作时拦截 JavaScript 调用返回的
Promise对象并暂停 WebAssembly 应用,导出的Promise对象在原始调用完成时解析或拒绝。 - 在动态加载代码的示例中,使用
fetch获取模块,通过EM_ASYNC_JS宏和WebAssembly.instantiateStreaming编译和实例化模块,使用函数指针实现透明的动态加载。 - 附录中提供了
badfib、u42.c和p42.c的完整代码清单,以及相关的注释说明。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。