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 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 团队期待收到您的源 试用反馈(请参阅 说明),确保该功能在推出后能满足您的需求!