JavaScript Promise Integration (JSPI) เป็น API ที่ช่วยให้โค้ดตามลำดับแบบพร้อมกันที่คอมไพล์ไปยัง WebAssembly เข้าถึง API ของเว็บแบบอะซิงโครนัสได้ Web API จำนวนมากสร้างขึ้นมาเป็นคำสัญญา JavaScript: แทนที่จะดำเนินการตามที่ขอในทันที ระบบจะตอบกลับคำสัญญาที่จะดำเนินการดังกล่าว เมื่อดำเนินการเสร็จสิ้นแล้ว ตัวเรียกใช้งานของเบราว์เซอร์จะเรียกใช้โค้ดเรียกกลับที่มีสัญญาดังกล่าว JSPI เชื่อมต่อกับสถาปัตยกรรมนี้เพื่อทำให้แอปพลิเคชัน WebAssembly ถูกระงับเมื่อมีการส่งคืนสัญญา และจะกลับมาใช้งานได้อีกครั้งเมื่อสัญญาได้รับการแก้ไขแล้ว
ตั้งแต่ 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
คุณสามารถตรวจหาการสนับสนุน JSPI จาก JavaScript โดยใช้วิธีการดังนี้
if ('Suspender' in WebAssembly) {
// JSPI is supported.
}
การสาธิต JSPI จากตัวอย่างโค้ดก่อนหน้านี้พร้อมใช้งานใน Glitch และยังฝังไว้ในตัวอย่างต่อไปนี้ด้วย คุณดูซอร์สโค้ดที่สร้างด้วย Emscripten ได้หากต้องการ แต่โค้ดที่น่าสนใจจริงๆ คือโปรแกรม C ต้นฉบับ (การคลิกลิงก์นี้จะเป็นการดาวน์โหลดโค้ด)
หากต้องการลองใช้ JSPI กับผู้ใช้จริงของแอปพลิเคชัน ให้ลงชื่อสมัครใช้ช่วงทดลองใช้จากต้นทาง หากต้องการทราบวิธีการ โปรดอ่านเริ่มต้นใช้งานช่วงทดลองใช้จากต้นทาง ทีม JSPI หวังเป็นอย่างยิ่งว่าจะได้รับความคิดเห็นเกี่ยวกับช่วงทดลองใช้จากต้นทาง (ดูขั้นตอนที่ 5 ในวิธีการ) เพื่อให้ฟีเจอร์นี้ตรงกับความต้องการของคุณเมื่อจัดส่ง