WebAssembly JavaScript Promise Integration (JSPI) เข้าสู่ช่วงทดลองใช้จากต้นทาง

JavaScript Promise Integration (JSPI) เป็น API ที่ช่วยให้โค้ดตามลำดับแบบซิงโครนัสซึ่งคอมไพล์ไปยัง WebAssembly เข้าถึง Web API แบบอะซิงโครนัสได้ Web API จำนวนมากสร้างขึ้นด้วยคำสัญญาของ JavaScript: แทนที่จะดำเนินการตามที่ขอโดยทันที แต่จะให้คำมั่นสัญญาว่าจะทำเช่นนั้น เมื่อการทำงานเสร็จสมบูรณ์ ตัวเรียกใช้งานของเบราว์เซอร์จะเรียก Callback ตามที่สัญญาไว้ JSPI เชื่อมเข้ากับสถาปัตยกรรมนี้เพื่อ อนุญาตให้แอปพลิเคชัน WebAssembly ถูกระงับเมื่อมีการส่งคืนคำสัญญา และจะทำงานต่อเมื่อสัญญาสำเร็จ

ตั้งแต่ Chrome 123 จนถึง Chrome 128 JSPI พร้อมใช้งานเป็นช่วงทดลองใช้จากต้นทาง ดูข้อมูลเพิ่มเติมเกี่ยวกับ JSPI ในบล็อกโพสต์แนะนำ WebAssembly JavaScript Promise Integration API หรือจากฉบับร่างข้อกำหนด

หากต้องการทําความเข้าใจวิธีใช้ฟีเจอร์นี้ได้ดียิ่งขึ้น โปรดดูตัวอย่างต่อไปนี้จากโปรแกรม C ที่คํานวณลําดับ Fibonacci โดยการ outsource การเพิ่มไปยังฟังก์ชัน 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

คุณตรวจจับการรองรับ JSPI ด้วยฟีเจอร์จาก JavaScript ได้ดังนี้

if ('Suspender' in WebAssembly) {
  // JSPI is supported.
}

การสาธิต JSPI จากตัวอย่างโค้ดก่อนหน้านี้มีให้ใช้งานใน Glitch และฝังอยู่ในโค้ดต่อไปนี้ด้วย คุณสามารถดูซอร์สโค้ดที่ Emscripten สร้างขึ้นได้หากต้องการ แต่โค้ดที่น่าสนใจจริงๆ คือโปรแกรม C ต้นฉบับ (การคลิกลิงก์นี้จะดาวน์โหลดโค้ด)

หากต้องการลองใช้ JSPI กับผู้ใช้จริงของแอปพลิเคชัน ให้ลงชื่อสมัครใช้ช่วงทดลองใช้เวอร์ชันเดิม หากต้องการวิธีการ โปรดอ่านเริ่มต้นใช้งานช่วงทดลองใช้จากต้นทาง ทีม JSPI หวังว่าจะได้รับความคิดเห็นจากคุณเกี่ยวกับเวอร์ชันทดลองใช้เวอร์ชันแรก (ดูขั้นตอนที่ 5 ในวิธีการ) เพื่อให้ฟีเจอร์นี้ตรงกับความต้องการของคุณเมื่อเปิดตัว