WebAssembly JavaScript Promise 集成 (JSPI) 进入源试用

JavaScript Promise Integration (JSPI) 是一个 API,可让编译为 WebAssembly 的同步依序代码访问异步 Web API。许多 Web API 都是根据 JavaScript promise 编写的:它们会返回一个 promise 来执行请求的操作,而不是立即执行请求的操作。最终执行操作后,浏览器的任务运行程序会使用 promise 调用所有回调。JSPI 连接到此架构,以便在返回 promise 时挂起 WebAssembly 应用,并在 promise 解析后恢复 WebAssembly 应用。

从 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.
}

Glitch 上提供了上一个代码示例中的 JSPI 演示,并且这些演示也嵌入了以下内容。如果需要,您可以查看 Emscripten 生成的源代码,但实际上感兴趣的代码是原始 C 程序(点击此链接即可下载代码)。

如需让应用的真实用户试用 JSPI,请注册源试用。如果您需要相关说明,请参阅开始进行源试用。JSPI 团队期待收到您的源试用反馈(请参阅说明中的第 5 步),以便该功能在推出时满足您的需求!