JavaScript Promise Integration (JSPI) یک API است که به کدهای متوالی همزمان کامپایل شده در WebAssembly اجازه می دهد تا به APIهای وب ناهمزمان دسترسی داشته باشند. بسیاری از APIهای وب بر اساس وعدههای جاوا اسکریپت ساخته شدهاند: به جای اجرای فوری عملیات درخواستی، قولی برای انجام آن برمیگردانند. هنگامی که این عمل در نهایت انجام شد، Task runner مرورگر هر تماس بک را با وعده فراخوانی می کند. JSPI به این معماری قلاب میکند تا به برنامه WebAssembly اجازه میدهد تا زمانی که وعده بازگردانده میشود، به حالت تعلیق درآید، و زمانی که وعده حل شد، از سر گرفته شود.
از Chrome 123 تا Chrome 128، JSPI به عنوان نسخه آزمایشی اصلی در دسترس است . درباره JSPI در پست وبلاگ معرفی WebAssembly JavaScript Promise Integration API یا از پیش نویس مشخصات بیشتر بیاموزید.
برای درک بهتر نحوه استفاده از این ویژگی، گزیده زیر از یک برنامه C را در نظر بگیرید که دنباله فیبوناچی را با برون سپاری اضافه به یک تابع جاوا اسکریپت محاسبه می کند.
// 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 را از جاوا اسکریپت به صورت زیر شناسایی کنید:
if ('Suspender' in WebAssembly) {
// JSPI is supported.
}
نسخه ی نمایشی JSPI از نمونه کد قبلی در Glitch موجود است و در ادامه نیز تعبیه شده است. اگر بخواهید می توانید کد منبع تولید شده توسط Emscripten را مشاهده کنید، اما کد جالب واقعاً برنامه C اصلی است (با کلیک بر روی این لینک، کد دانلود می شود).
برای آزمایش JSPI با کاربران واقعی برنامه خود، در نسخه آزمایشی اصلی ثبت نام کنید . اگر به دستورالعملهایی نیاز دارید ، شروع با آزمایشهای اولیه را بخوانید. تیم JSPI مشتاقانه منتظر دریافت بازخورد آزمایشی اصلی شما است ( مرحله 5 را در دستورالعمل ها ببینید) تا این ویژگی هنگام ارسال با نیازهای شما مطابقت داشته باشد!