JavaScript Promise Integration (JSPI) là một API cho phép mã tuần tự đồng bộ được biên dịch thành WebAssembly để truy cập vào các API Web không đồng bộ. Nhiều API Web được tạo theo lời hứa của JavaScript: thay vì thực hiện ngay thao tác được yêu cầu, các API này sẽ trả về một lời hứa để thực hiện thao tác đó. Khi thao tác cuối cùng được thực hiện, trình chạy tác vụ của trình duyệt sẽ gọi mọi lệnh gọi lại bằng lời hứa. JSPI sẽ móc nối vào cấu trúc này để cho phép ứng dụng WebAssembly bị tạm ngưng khi promise được trả về và tiếp tục hoạt động khi promise được phân giải.
Từ Chrome 123 đến Chrome 128, JSPI có sẵn dưới dạng một thử nghiệm theo nguyên gốc. Tìm hiểu thêm về JSPI trong bài đăng trên blog Giới thiệu về WebAssembly JavaScript Promise Integration API hoặc trong bản nháp đặc tả.
Để hiểu rõ hơn về cách sử dụng tính năng này, hãy xem xét đoạn trích sau đây của một chương trình C tính toán dãy Fibonacci bằng cách thuê ngoài phép cộng cho một hàm 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);
});
Để biên dịch chương trình C này sang WebAssembly, hãy dùng lệnh sau. Lệnh này yêu cầu Emscripten SDK.
emcc -O3 badfib.c -o index.html -s ASYNCIFY=2
Bạn có thể phát hiện tính năng hỗ trợ JSPI từ JavaScript như sau:
if ('Suspender' in WebAssembly) {
// JSPI is supported.
}
Để dùng thử JSPI với người dùng thực tế của ứng dụng, hãy đăng ký dùng thử nguồn gốc. Hãy đọc bài viết Bắt đầu dùng thử nguồn gốc nếu bạn cần hướng dẫn. Nhóm JSPI rất mong nhận được ý kiến phản hồi của bạn về thử nghiệm nguồn gốc (xem Bước 5 trong hướng dẫn) để tính năng này phù hợp với nhu cầu của bạn khi được phát hành!