JavaScript Promise 集成 (JSPI) 是一个 API,可让编译为 WebAssembly 的同步顺序代码访问异步 Web API。许多 Web API 都是根据 JavaScript promise 构建的:它们会返回一个 promise 来执行请求的操作,而不是立即执行该操作。当操作最终执行时,浏览器的任务运行程序会使用 promise 调用任何回调。JSPI 会钩入此架构,以允许在返回 promise 时暂停 WebAssembly 应用,并在 promise 解析时恢复该应用。
从 Chrome 123 到 Chrome 128,JSPI 可作为源试用版提供。如需详细了解 JSPI,请参阅博文 Introducing the WebAssembly JavaScript Promise Integration API 或规范草稿。
如需更好地了解如何使用此功能,请考虑以下 C 程序摘录,该程序通过将加法外包给 JavaScript 函数来计算斐波那契数列。
// This is C code.
long promiseFib(long x) {
if (x == 0)
return 0;
if (x == 1)
return 1;
// This is where the C code calls asynchronous JavaScript.
return promiseAdd(promiseFib(x - 1), promiseFib(x - 2));
}
// Addition artificially wrapped in a Promise.
EM_ASYNC_JS(long, promiseAdd, (long x, long y), {
// This is asynchronous JavaScript code.
return Promise.resolve(x+y);
});
如需将此 C 程序编译为 WebAssembly,请使用以下命令,该命令需要 Emscripten SDK。
emcc -O3 badfib.c -o index.html -s ASYNCIFY=2
您可以通过 JavaScript 功能检测 JSPI 支持,如下所示:
if ('Suspender' in WebAssembly) {
// JSPI is supported.
}
上一个代码示例中的 JSPI 演示在 Glitch 上提供,并且也嵌入在下文中。您可以根据需要查看 Emscripten 生成的源代码,但真正有趣的代码是原始 C 程序(点击此链接可下载该代码)。
如需面向应用的真实用户试用 JSPI,请注册源代码试用版。如果您需要相关说明,请参阅开始使用来源试用。JSPI 团队期待收到您的原始试用反馈(请参阅说明中的第 5 步),以便在该功能发布时满足您的需求!