WebAssembly JavaScript Promise Integration (JSPI) 進入來源試用

JavaScript Promise 整合 (JSPI) 是一個 API,可讓編譯至 WebAssembly 的依序程式碼存取非同步 Web API。許多 Web API 都是以 JavaScript 的「承諾」為建構依據:這些 API 不會立即執行要求的作業,而是會傳回承諾會。最終執行動作時,瀏覽器的工作執行器會叫用任何具有 promise 的回呼。JSPI 掛載到這個架構中,以便在傳回 promise 時暫停 WebAssembly 應用程式,並在 Proto 解決後恢復執行。

從 Chrome 123 到 Chrome 128,開發人員可以試用 JSPI。 如要進一步瞭解 JSPI,請參閱「隆重推出 WebAssembly JavaScript Promise Integration API」網誌文章或規格草稿

如要進一步瞭解如何使用這項功能,請考慮以下 C 程式的節錄內容。該程式是計算 Fibonacci 序列,將外加至 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),確保這項功能能在出貨時滿足您的需求!