主要观点:
- 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 编译命令等。
重要细节:
fetch
API 是异步的,返回Promise
对象,通过附加回调来处理响应。- C/C++应用通常基于同步 API 编写,而浏览器主线程不允许阻塞,许多环境也不支持同步编程,JSPI 解决了这一矛盾。
- JSPI 工作时拦截 JavaScript 调用返回的
Promise
对象并暂停 WebAssembly 应用,导出的Promise
对象在原始调用完成时解析或拒绝。 - 在动态加载代码的示例中,使用
fetch
获取模块,通过EM_ASYNC_JS
宏和WebAssembly.instantiateStreaming
编译和实例化模块,使用函数指针实现透明的动态加载。 - 附录中提供了
badfib
、u42.c
和p42.c
的完整代码清单,以及相关的注释说明。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。