JavaScript Promise Integration (JSPI) هي واجهة برمجة تطبيقات تسمح للرمز المتزامن التسلسلي الذي تم تجميعه إلى WebAssembly بالوصول إلى واجهات برمجة تطبيقات الويب غير المتزامنة. تم تصميم العديد من واجهات برمجة التطبيقات لصفحات الويب استنادًا إلى وعود لغة 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 في التعليمات) كي تناسب الميزة احتياجاتك عند شحنها.