การผสานรวมสัญญา JavaScript (JSPI) คือ API ที่อนุญาตให้โค้ดตามลำดับแบบซิงโครนัสที่คอมไพล์เป็น WebAssembly เข้าถึง Web API แบบอะซิงโครนัส Web API จำนวนมากสร้างขึ้นจากสัญญาของ JavaScript ซึ่งจะแสดงผลการดำเนินการที่ขอแทนที่จะดำเนินการทันที เมื่อดำเนินการเสร็จแล้ว โปรแกรมรันไทม์ของเบราว์เซอร์จะเรียกใช้การเรียกกลับด้วยสัญญา JSPI เชื่อมต่อกับสถาปัตยกรรมนี้เพื่ออนุญาตให้ระงับแอปพลิเคชัน WebAssembly เมื่อระบบแสดงผล Promise และกลับมาทำงานต่อเมื่อระบบแก้ไข Promise แล้ว
ตั้งแต่ 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 ในวิธีการ) เพื่อให้ฟีเจอร์นี้ตรงกับความต้องการของคุณเมื่อเปิดตัว