سیستم فایل خصوصی مبدا دسترسی به نوع خاصی از فایل را فراهم می کند که برای عملکرد بسیار بهینه شده است، به عنوان مثال، با ارائه دسترسی نوشتن در محل و انحصاری به محتوای یک فایل. توسعهدهندگان میتوانند با فراخوانی createSyncAccessHandle()
به چنین فایلهایی دسترسی پیدا کنند، که روشی است که روی اشیاء FileSystemFileHandle
در معرض دید قرار میگیرد. این تماس منجر به یک FileSystemSyncAccessHandle
می شود.
FileSystemSyncAccessHandle
یک فایل ابتدایی است که دسترسی موثر به فایل های محلی را فراهم می کند. یکی از موارد استفاده اصلی آن، برنامه هایی است که کد C/C++ را به Wasm منتقل می کنند. با این حال، تماسهای ناهمزمان هنوز به طور کامل در Wasm پشتیبانی نمیشوند و استفاده از کتابخانه Asyncify بهعنوان جایگزین، عملکرد را بهطور قابلتوجهی کاهش داده است. همزمان کردن همه روشهای FileSystemSyncAccessHandle
با برنامه کاربردی مبتنی بر Wasm API فایل مشابه POSIX مطابقت دارد. API را ارگونومیک تر می کند و در عین حال دستاوردهای عملکرد قابل توجهی را به همراه دارد.
چه خبر؟
FileSystemSyncAccessHandle
روشهای زیر را که قبلاً ناهمزمان بودند، اما در Chromium 108 همگام هستند، نشان میدهد.
-
truncate(newSize)
: اندازه فایل مرتبط با دستگیره دسترسی را تغییر می دهد تاnewSize
بایت باشد. اگرnewSize
بزرگتر از اندازه فایل فعلی باشد، فایل را با بایت های پوچ می کند. در غیر این صورت فایل را کوتاه می کند. -
getSize()
: اندازه فایل مرتبط با دستگیره دسترسی را بر حسب بایت برمی گرداند. -
flush()
: اطمینان حاصل می کند که محتویات فایل مرتبط با دسته دسترسی حاوی تمام تغییرات انجام شده از طریقwrite()
باشد. -
close()
: دستگیره دسترسی را فلاش می کند و سپس آن را می بندد. بستن یک دسته دسترسی، هرگونه عملیات بیشتر روی آن را غیرفعال می کند و قفل ورودی مرتبط با دستگیره دسترسی را آزاد می کند.
// In a `Worker`:
const root = await navigator.storage.getDirectory();
const fileHandle = await root.getFileHandle('test', { create: true });
// `createSyncAccessHandle()` is still async.
const accessHandle = await fileHandle.createSyncAccessHandle();
// Both `read()` and `write()` were sync before.
accessHandle.read(/* ... */);
accessHandle.write(/* ... */);
// New: synchronous as of Chromium 108.
console.log(accessHandle.getSize());
accessHandle.truncate(123);
accessHandle.flush();
accessHandle.close();
چه کاری باید انجام دهم؟
توجه داشته باشید که تغییر روش ها از ناهمزمان به همزمان، یک تغییر تحت وب با احتمال شکستگی است. در حالی که استفاده از await
در متدهای همزمان بدون عملیات است، هر گونه استفاده از Promise.then()
خراب خواهد شد. اگر یک زنگ then()
را بر روی نتیجه هر یک از متدهای قبلی ناهمزمان و اکنون همزمان زنجیره بزنید، باید کد خود را تغییر دهید.
// (✅) This won't break, but you better remove the superfluous `await`:
await accessHandle.flush();
// ✅ Correct:
accessHandle.flush();
// ⛔️ This will break, and you need to restructure your code:
accessHandle.flush().then(/* Follow-up code */);
// ✅ Correct:
accessHandle.flush();
/* Follow-up code */
لینک های مرتبط
- بررسی تگ
- مشخصات
- مشکل مشخصات (که منجر به تغییر شد)
- ورودی ChromeStatus
- اشکال کروم