JavaScript Promise 集成 (JSPI) 是一种 API,可让编译为 WebAssembly 的同步顺序代码访问异步 Web API。许多 Web API 都是根据 JavaScript promise 打造的:它们不会立即执行所请求的操作,而是返回一个 promise 来执行该操作。当最终执行该操作时,浏览器的任务运行程序会使用该 promise 调用任何回调。JSPI 会挂接到此架构中,以便在返回 promise 时暂停 WebAssembly 应用,并在 promise 解析时恢复该应用。
从 Chrome 123 到 Chrome 128,JSPI 以源试用形式提供。 如需详细了解 JSPI,请参阅博文推出 WebAssembly JavaScript Promise 集成 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,请注册源试用。如果您需要相关说明,请参阅源试用入门。JSPI 团队期待收到您的源试用反馈(请参阅说明中的第 5 步),以便该功能在正式发布时能够满足您的需求!