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

JavaScript Promise 整合 (JSPI) 是一種 API,可讓編譯為 WebAssembly 的同步順序程式碼存取非同步 Web API。許多 Web API 都是以 JavaScript promise 編寫:這些 API 不會立即執行要求的作業,而是會傳回 promise 來執行作業。當作業最終執行時,瀏覽器的工作執行程式會使用 promise 叫用任何回呼。JSPI 會連結至這個架構,在傳回承諾時暫停 WebAssembly 應用程式,並在解決承諾時恢復。

自 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),以便在功能推出時滿足你的需求!