JavaScript Promise Integration (JSPI) הוא ממשק API שמאפשר לקוד סדרתי מסונכרן שעבר הידור ל-WebAssembly לגשת לממשקי API לא-סינכרוניים באינטרנט. הרבה ממשקי Web API נוצרים באמצעות הבטחות של JavaScript: במקום לבצע את הפעולה המבוקשת באופן מיידי, הם מחזירים הבטחה לביצוע הפעולה. כשהפעולה מתבצעת סוף סוף, מנהל המשימות של הדפדפן מפעיל את כל הפונקציות החזרה (callbacks) עם ההבטחה. JSPI מתחבר לארכיטקטורה הזו כדי לאפשר השהיה של אפליקציית WebAssembly כשהבטחה מוחזרת, ולהמשיך אותה כשהבטחה מתקבלת.
החל מגרסה 123 של Chrome עד Chrome 128, JSPI זמין כגרסת המקור לניסיון. מידע נוסף על JSPI זמין בפוסט בבלוג Introducing the 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 בהוראות) כדי שהתכונה תתאים לצרכים שלכם כשהיא תשוחרר.