createHandoff
مقداری (یک File، یک Blob، هر چیزی که رونوشت ساختاریپذیر باشد) را از یک صفحه به صفحهٔ بعدی در همان مبدأ میسپارد.
Fileای که کاربر در صفحهٔ A برگزیده، به صفحهٔ B نمیرسد. نه در نشانی جا میشود و نه سریالپذیر است؛ sessionStorage هم تنها رشته میگیرد. IndexedDB مقدارهای رونوشتساختاریپذیر را همانگونه که هستند نگه میدارد، پس صفحهٔ A مقدار را میگذارد و میرود و صفحهٔ B آن را برمیدارد.
API
createHandoff(options)
| پارامتر | توضیح | نوع | پیشفرض |
|---|---|---|---|
dbName | نام پایگاه داده؛ هر دو سو باید بر سرش همداستان باشند | string | الزامی |
storeName | نام انبارهٔ شیء، که در نخستین گشودن ساخته میشود | string | 'files' |
key | کلیدی که آن یک مقدارِ در انتظار زیر آن نگه داشته میشود | string | 'pending' |
بازگشت
| متد | توضیح |
|---|---|
put(value) | مقداری را برای صفحهٔ بعد میگذارد. اگر نتواند، false |
take() | مقدار در انتظار را برمیدارد و پاکش میکند. اگر چیزی نباشد، null |
نمونه
صفحهٔ ورودی فایلی را به برنامه میسپارد
import { createHandoff } from 'ranuts';
const handoff = createHandoff({ dbName: 'document-handoff' });
input.addEventListener('change', async () => {
await handoff.put(input.files[0]);
location.href = '/app?open=local';
});برنامه آن را برمیدارد
import { createHandoff, queryFlag } from 'ranuts';
const handoff = createHandoff({ dbName: 'document-handoff' });
if (queryFlag('open')) {
const file = await handoff.take();
if (file) openDocument(file); // با بارگذاری دوباره null است — مقدار مصرف شده
}یادداشتها
خواندن، ویرانگر است.
take()مقدار را در همان تراکنشی که میخواندش پاک میکند. همین است که نمیگذارد بارگذاری دوبارهٔ صفحه همان فایل را از نو باز کند، و همین است که نشانی کهنهٔ?open=localچیزی نمییابد.دو زبانه نمیتوانند هر دو ببرند. چون خواندن و پاک کردن در یک تراکنشاند، در رقابت میان زبانهها مقدار دقیقاً به یکی از آنها میرسد.
putهنگام تثبیت برآورده میشود، نه هنگام درخواست نوشتن. مقدار تنها پس از تثبیت تراکنش ماندگار است، و صفحه معمولاً بلافاصله پس از آن جابهجا میشود.شکستها بیصدایند. نبودن یا بسته بودن IndexedDB (رندر سمت سرور، حالت ناشناس، قابی از دامنهٔ دیگر) باعث میشود
putباfalseوtakeباnullبرآورده شوند. صفحهای که تنها کوشیده چیزی را بسپارد، نباید به سبب نبودن انباره بشکند.انباره در نسخهٔ ۱ ساخته میشود، به دست هر سویی که زودتر پایگاه داده را بگشاید؛ دیگری آن را از پیش آماده مییابد.
هر بار یک مقدار. این سپردن است، نه صف:
putدوم مقدار در انتظار را رونویسی میکند. اگر انبارهٔ راستین میخواهید، ازWebDBاستفاده کنید.